将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定义键。
这里有什么解决方案?
答案 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
,因为它是主键的一部分,但这样它就不再作为外键属性。
只是一个想法,我不确定它是否有效。