我们正在考虑将本周EF 4.2的恐龙升级到EF 6.0.2(Code First)。在大多数情况下,除了一些命名空间更改之外,一切都有效,但有一个例外。
使用EF 4.2,一个特定的多对多关系具有预期的特定连接表名称。 EF 6期待不同的一个。
以下是代码的相关部分
public class MyDbContext : DbContext {
/* some unrelated collections*/
public IDbSet<DBFoo> Foos { get; set; }
/* some unrelated collections */
public IDbSet<DBBar> Bars { get; set; }
/* some unrelated collections */
}
public class DBFoo {
/* DBFoo's properties */
public virtual ICollection<DBBar> Bars { get; set; }
}
public class DBBar {
/* DBBar's properties */
/*some unrelated navigation properties (some single, some collections)*/
public virtual ICollection<DBFoo> Foos { get; set; }
/*more unrelated navigation properties*/
}
重要的是要注意提到的“不相关”属性是其他实体,但它们本身没有引用“DBFoo”。
现在,在EF 4.2中,这两个实体之间的连接表应该是DBBarDBFoos
。这在模型构建器或上下文中没有任何配置或使用任何数据注释。
升级到EF 6.0.2后,连接表应为DBFooDBBars
。为什么呢?
注意:我通过使用流畅的API将关系绑定到正确的表来“解决”此问题。我想知道的是为什么这个表(只有这个表)改变了它的惯例。
Ninja Edit - 在DBContext中重新排列属性声明的效果绝对没有。
答案 0 :(得分:3)
查看EF团队的答案
https://entityframework.codeplex.com/workitem/1677
RoMiller的回答
您好, 在EF6之前,某些模型创建领域是非确定性的 - 取决于您是在x86还是x64上运行,您可以获得不同的模型。多个连接表名称是其中一个区域。 在EF6中,我们解决了这个问题,以确保结果始终如一。不幸的是,这确实意味着对于某些模型(取决于它们运行的架构),升级到EF6会导致模型更改。但是现在计算的模型将在机器和EF的未来版本之间保持一致。 如果要继续使用原始名称,最佳选择是使用Fluent API指定连接表名称。 〜罗文