首页 文章

在EF代码中首先映射TPT 4.1 w /不同的主键

提问于
浏览
6

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

作为简化示例:

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

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

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

3 回答

  • 3

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

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

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

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

  • 0

    我通过执行以下操作来实现此目的:

    • 删除基础对象和继承对象之间的所有导航属性 .

    • 从继承的对象中删除外键,并删除继承对象中外键的属性映射 .

    • 删除继承对象中的表映射 .

    • 将数据库生成的标识选项添加到继承对象的主键(如果您在PK上使用标识) .

    • 将基类型的映射添加到派生类型,并且映射中的(重要位)显式映射未出现在基类/表中的每个属性 . 在 Map 中,还将派生类型映射到派生类型的表 .

    那应该是这样做的 . 该链接指向EF < - > RIA < - > Silverlight中的示例解决方案,该解决方案还显示了基础和派生类型中具有相同名称的属性的解决方法(解决方案基本上只是在基础中重命名该属性)类型或派生类型) .

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

  • 1

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

    • 在C#中定义实体Vehicle(VehicleId,Make,Model)

    • 在C#define实体Car(SomeOtherField)中,派生自Vehicle // CarId列将映射到VehicleId,见下文如何 .

    • 在'protected override void OnModelCreating(DbModelBuilder modelBuilder)'中执行以下操作:

    modelBuilder.Entity() . ToTable(“Car”).Property(t => t.VehicleId).HasColumnName(“CarId”);

相关问题