如何在没有HasForeignKey()的情况下引用外键

时间:2011-05-10 14:30:54

标签: entity-framework

将EF 4.0与4.1升级用于POCO /代码优先。

好的,所以我有一个域模型,其中类型Car在集合中具有多个Part类型的对象。所以一个:很多关系。

HasMany(v => v.Parts)
  .WithRequired()
  .HasForeignKey(v => v.CarId)
  .WillCascadeOnDelete();

这个问题是它要求我在CarId类型中添加Part属性。这是将ORM细节泄漏到我的域模型中 - 这很糟糕。将所有内容标记为虚拟是非常烦人的。

查看HasForeignKey()方法的XML doc评论说明了这一点:

  

配置要使用的关系   外国关键财产   暴露在对象模型中。 如果   外键属性不是   在对象模型中暴露然后使用   地图方法。

那太好了。但是它引入了一个catch-22情况,因为如果我通过删除我不想要的Part属性重构我的CarId类型并更新我的EF模型构建器而不打扰映射该属性。然后你可以想象这意味着我不能再调用HasKey()来定义复合键,ala:

HasKey(v => new { v.CarId, v.PartId });

HasKey()似乎不支持基于非属性lambdas定义键。

这里有什么解决方案?

2 个答案:

答案 0 :(得分:1)

那么,如何将新的关键字段添加到CarParts表(如CarPartId),那么您就不需要复合键了。 (使用ORM时,复合键支持不是很好。)

答案 1 :(得分:1)

如果您绝对不希望在模型中使用外键属性,则可以删除约定以检测FK属性,以避免EF将属性自动标记为FK属性...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions
        .Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
}

...然后只是不在映射中指定FK属性:

HasMany(v => v.Parts)
    .WithRequired()
    .WillCascadeOnDelete();

您的模型中仍然需要CarId,因为它是主键的一部分,但这样它就不再作为外键属性。

只是一个想法,我不确定它是否有效。