EF Code First更改了版本4和6之间的连接表约定

时间:2014-01-13 14:48:21

标签: entity-framework entity-framework-6 jointable

我们正在考虑将本周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中重新排列属性声明的效果绝对没有。

1 个答案:

答案 0 :(得分:3)

查看EF团队的答案

https://entityframework.codeplex.com/workitem/1677

RoMiller的回答

您好, 在EF6之前,某些模型创建领域是非确定性的 - 取决于您是在x86还是x64上运行,您可以获得不同的模型。多个连接表名称是其中一个区域。 在EF6中,我们解决了这个问题,以确保结果始终如一。不幸的是,这确实意味着对于某些模型(取决于它们运行的​​架构),升级到EF6会导致模型更改。但是现在计算的模型将在机器和EF的未来版本之间保持一致。 如果要继续使用原始名称,最佳选择是使用Fluent API指定连接表名称。 〜罗文