在EF Code First 4.1中使用不同的主键映射TPT

时间:2011-07-13 15:12:16

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

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

作为简化示例:

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

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

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

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

我通过以下方式让这个工作:

  1. 删除基础对象和继承对象之间的所有导航属性。
  2. 从继承的对象中删除外键,并删除继承对象中外键的属性映射。
  3. 删除继承对象中的表映射。
  4. 将数据库生成的标识选项添加到继承对象的主键(如果您在PK上使用标识)。
  5. 将基本类型的映射添加到派生类型,并且映射中的(重要位)显式映射未出现在基类/表中的每个属性。在地图中,还将派生类型映射到派生类型的表。
  6. 那应该是这样做的。该链接指向EF中的样本解决方案。 RIA< - > Silverlight,它还显示了基础和派生类型中具有相同名称的属性的解决方法(该解决方案基本上只是在基本类型或派生类型中重命名该属性)。

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

答案 2 :(得分:0)

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

  1. 在C#define实体Vehicle(VehicleId,Make,Model)
  2. 在C#define实体Car(SomeOtherField)中,派生自Vehicle // CarId列将映射到VehicleId,请参见下文。
  3. 在'protected override void OnModelCreating(DbModelBuilder modelBuilder)'中执行此操作:

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