跨多个上下文的实体框架,代码优先和一对多关系

时间:2013-09-18 09:53:06

标签: entity-framework code-first ef-migrations

我首先使用VS 2010和Entity Framework代码(版本6)。我在它自己的上下文中有两个实体,我想在它们之间创建一对多的关系。

上下文1具有以下实体:

public class MyTrust
{
    public int MyTrustID { get; set; }
    public string MyTrustName { get; set; }
}

和Context 2具有以下实体:

public class MyLocation
{
    public int MyLocationID { get; set; }
    public int MyTrustID { get; set; }
    public virtual MyTrust MyTrust { get; set; }
}

使用以下Fluent API

modelBuilder.Entity<MyLocation>()
    .HasRequired(m => m.MyTrust);

Context 2的迁移文件包含正确的密钥,但也为MyTrust创建了一个已存在于其他上下文中的新表。

我知道我可以编辑迁移文件,但这不是解决方案。

我的问题是,如何停止创建第二个MyTrust表。

更新

上面有一个重大缺陷,我将错误的代码粘贴到Context 2中。现在纠正了。道歉。

1 个答案:

答案 0 :(得分:5)

您正在使用所谓的有界上下文。这些上下文的好处以及如何使用它们在blog by Julie Lerman中进行了解释。

您遇到的问题是,在迁移过程中没有任何上下文可用于此部分:

  

如果您正在进行新的开发,并且希望让Code First根据您的类创建或迁移您的数据库,则需要使用包含所有类和关系的DbContext创建“超级模型”需要构建一个代表数据库的完整模型。

请注意,如果您遵守这些规则,则可以在所有上下文之间共享MyTrust类型(来自Lerman&amp; Miller的书 DbContext ,第233页):

  
      
  • 实体一次只能附加到一个上下文。这种架构有效   最好使用短期上下文,其中要共享的实例将是完全的   在与另一个背景相关联之前,它与一个背景脱离关联。
  •   
  • 附加到不同上下文的实体不能相互连接。
  •   

<强>更新

在EF6中,您可以将多个上下文用于一个迁移路径。请参阅this walkthrough