【问题标题】:Entity Framework, TPT Inheritance and Multi-Language support实体框架、TPT 继承和多语言支持
【发布时间】:2011-04-24 08:55:35
【问题描述】:

我有这个数据库结构:

服务

  • Id int PK
  • 类别 ID FK
  • SomeOtherFields

本地化服务

  • Lo​​calizedServiceId PK
  • LanguageId FK
  • 姓名
  • 说明

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

  • 1, 1, SomeService, NULL
  • 2, 1, AnotherService, NULL
  • 2, 2, RussianTranslationService, NULL

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

【问题讨论】:

    标签: c# sql-server entity-framework ado.net


    【解决方案1】:

    您从 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>
    ...
    

    不建议这样做,因为如果您这样做,那么从数据库更新模型向导会在您每次进行更新时尝试“修复”您的映射。

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

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多