【问题标题】:Mapping TPT in EF Code First 4.1 w/ Different Primary Keys在具有不同主键的 EF Code First 4.1 中映射 TPT
【发布时间】:2011-07-13 15:12:15
【问题描述】:

我正在尝试在旧数据库上映射 TPT 继承层次结构(我无法更改列名)。所有示例都具有同名的父表和子表的主键。不幸的是,我的行为不是这样。

作为一个简化的例子:

Vehicle
----------------
VehicleId
Make
Model
----------------

Car
----------------
CarId        
SomeOtherField
----------------

CarId 和 VehicleId 实际上是相同的 id,并且是应该用于关联表的值。是否支持在 Code First 中将此创建为 TPT 关系?

【问题讨论】:

    标签: .net entity-framework entity-framework-4.1 ef-code-first


    【解决方案1】:

    Here 是 EF 团队关于此问题的声明:

    很遗憾,在现阶段这是不可能的。我意识到这不是 一个很好的答案,但一种选择是创建一个重命名的视图 PK/FK 列,然后映射到该列。

    它是从 2011 年 2 月开始的。所以它与 EF Code-First 的早期 CTP 版本有关。但我相信 EF 4.1 仍然不支持这种情况。

    这里还有一个类似的问题,但关于 EF 4.1 Code-First 的结果不令人满意:How can I use TPT inheritance models when primary keys have different names?

    【讨论】:

    • 谢谢 - 我真的见过另一个 S.O.问题,并且从未真正回答过。我想我只是希望有些事情发生了变化......
    • 你知道为什么会出现这个问题吗?因为代码优先被开发为“代码优先”。所有关于在现有数据库中使用 DbContext 的初始文章都涉及 EDMX。对现有数据库使用流畅的映射只是自然发生的事情,但我相信在开发过程中的大部分时间都不应该这样做。因此,从不需要此功能,因为当您从代码映射继承时,您在基类中只定义了一个 Id 属性,您将让 EF 完成它的工作。
    【解决方案2】:

    我通过执行以下操作使其工作:

    1. 删除基础对象和继承对象之间的所有导航属性。
    2. 从继承对象中移除外键,同时移除继承对象中外键的属性映射。
    3. 删除继承对象中的表映射。
    4. 将数据库生成的身份选项添加到继承对象的主键(如果您在 PK 上使用身份)。
    5. 将基类型的映射添加到派生类型,并且(重要的一点)在映射中显式映射未出现在基类/表中的每个属性。在映射中,还将派生类型映射到派生类型的表。

    应该差不多了。该链接指向 EF RIA Silverlight 中的示例解决方案,它还显示了在基类型和派生类型中具有相同名称的属性的解决方法(该解决方案本质上只是在基类型中重命名属性)类型或派生类型)。

    http://dotnetdavis.com/upload/content/source.zip

    【讨论】:

      【解决方案3】:

      我在这里找到了这篇文章的答案:http://entityframework.codeplex.com/workitem/2087。对于您的情况,您需要:

      1. 在 C# 中定义实体 Vehicle(VehicleId、Make、Model)
      2. 在 C# 中定义实体 Car (SomeOtherField),派生自 Vehicle //CarId 列将映射到 VehicleId,具体方法见下文。
      3. 在'protected override void OnModelCreating(DbModelBuilder modelBuilder)'中这样做:

        modelBuilder.Entity() .ToTable("汽车") .Property(t => t.VehicleId).HasColumnName("CarId");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多