gpt4 book ai didi

c# - Entity Framework 、TPT 继承和多语言支持

转载 作者:太空宇宙 更新时间:2023-11-03 11:43:53 25 4
gpt4 key购买 nike

我有这个数据库结构:

服务

  • Id 整数 PK
  • CategoryId FK
  • 一些其他领域

本地化服务

  • LocalizedServiceId 公钥
  • LanguageId FK
  • 姓名
  • 描述

如您所见,我有一个名为 Service 的基表和一个 LocalizedService 表,我在其中写入多语言数据,例如应翻译成不同语言的名称和描述。我已经使用 TPT 继承在 EF 设计器中链接了两个表。 Service 是 LocalizedService 的基类。问题是,TPT 要求两个表都有主键,如果我使用一种语言,这不是问题,但我应该将服务行翻译成 3 种不同的语言。所以只有 LocalizedServiceId 不应该是唯一的,但是 LocalizedServiceId + LanguageId 的组合应该是唯一的,因为我不能在 LocalizedService 中插入多个语言行。例如,看看下面的 LocalizedService 行:

  • 1, 1, SomeService, NULL <-- 已插入
  • 2, 1, AnotherService, NULL <-- 已插入
  • 2, 2, RussianTranslationService, NULL <-- 无法插入,因为表中已存在值为 2 的 LocalizedServiceId。

这在数据库方面不是问题,我可以为多个字段创建 PK(例如,LocalizedServiceId 和 LanguageId 都将是主键),但在这种情况下,EF 设计器会抛出错误:“错误 13 错误 75: key 用法无效。uPay.Data.Entities.LocalizedServiceRecord 无法定义 key ,因为其基类之一 (uPay.Data.Entities.ServiceRecord) 定义了 key 。D:\Projects\uPay\uPay.Data .Entities\Entities.edmx 1531 9 uPay.Data.Entities”。我真的需要尽快解决这个问题,非常感谢您的帮助。

最佳答案

您从 EDM 中得到的错误是由于 EF 支持一对一关联的 2 个实体之间的 TPT 继承,这意味着数据库上的一对一关系,并且本质上要求两个表都具有非常主键。您的场景本质上是一对多关系,其中每个服务都可以根据 ServiceID 和 LocalizationID 进行许多本地化。

Craig Stuntz 在他的帖子 here 中提出了 2 种解决方法顺便说一句,第一个是深入到 EDM 的 SSDL 部分并从 Key 部分删除 LanguageId:

<EntityType Name="ServiceTypeLocale">
<Key>
<PropertyRef Name="LocalizedServiceId" />
<!-- You have to comment this:-->
<!--<PropertyRef Name="LanguageId" />-->
</Key>
...

顺便说一句,不推荐这样做,因为如果您这样做,从数据库更新模型 向导将在您每次进行更新时尝试“修复”您的映射。

另一种解决方法是在您的数据库中创建一个 View 并模拟一对一关系,然后映射该 View 而不是 ServiceLocalization 表。

关于c# - Entity Framework 、TPT 继承和多语言支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com