Entity framework 实体框架、代码优先和跨多个上下文的一对多关系
我首先使用VS2010和实体框架代码(版本6)。我在各自的上下文中有两个实体,我想在它们之间创建一对多的关系 上下文1具有以下实体:Entity framework 实体框架、代码优先和跨多个上下文的一对多关系,entity-framework,code-first,entity-framework-migrations,Entity Framework,Code First,Entity Framework Migrations,我首先使用VS2010和实体框架代码(版本6)。我在各自的上下文中有两个实体,我想在它们之间创建一对多的关系 上下文1具有以下实体: public class MyTrust { public int MyTrustID { get; set; } public string MyTrustName { get; set; } } public class MyLocation { public int MyLocationID { get; set; } pu
public class MyTrust
{
public int MyTrustID { get; set; }
public string MyTrustName { get; set; }
}
public class MyLocation
{
public int MyLocationID { get; set; }
public int MyTrustID { get; set; }
public virtual MyTrust MyTrust { get; set; }
}
上下文2具有以下实体:
public class MyTrust
{
public int MyTrustID { get; set; }
public string MyTrustName { get; set; }
}
public class MyLocation
{
public int MyLocationID { get; set; }
public int MyTrustID { get; set; }
public virtual MyTrust MyTrust { get; set; }
}
使用以下fluentapi
modelBuilder.Entity<MyLocation>()
.HasRequired(m => m.MyTrust);
modelBuilder.Entity()
.HasRequired(m=>m.MyTrust);
上下文2的迁移文件包含正确的键,但也为另一个上下文中已经存在的MyTrust
创建了一个新表
我知道我可以编辑迁移文件,但这不是一个解决方案
我的问题是,如何停止创建第二个MyTrust
表
更新
上面有一个主要缺陷,我将错误的代码粘贴到上下文2中。现在更正。抱歉。您正在处理所谓的有界上下文。本文解释了这种环境的好处以及如何使用它们 您遇到的问题(没有一个上下文可用于迁移)将在本部分中解决: 如果您正在进行新的开发,并且希望让代码首先基于类创建或迁移数据库,则需要使用DbContext创建一个“uber模型”,其中包含构建表示数据库的完整模型所需的所有类和关系 请注意,如果您遵守这些规则,您可以在所有上下文之间共享
MyTrust
类型(摘自Lerman&Miller的书DbContext,第233页):
- 一个实体一次只能附加到一个上下文。这种架构很有效 最好使用短期上下文,其中要共享的实例将完全 在一个上下文附加到另一个上下文之前,先将其与该上下文解除关联
- 附加到不同上下文的实体不能相互附加
在EF6中,一条迁移路径可以使用多个上下文。请参阅。谢谢格特。问题中有一个重大错误,现已更正。这会影响你的答案吗?不会。在迁移过程中,您始终需要这种“uber上下文”。所有上下文仍将包含
MyTrust
类型,因此共享部分仍然适用。Context2必须包含它,否则您无法定义关联。@GertArnold没有用另一种方式解决此问题,这意味着您不需要ubercontext@Colin这是关于在不同的数据库模式中使用不同的模型。但是这里至少有一个实体在上下文之间共享,所以它在同一个模式中。AFAIK,EF不支持(也没有任何计划)将上下文“合并”到一个数据库模式中。@GertArnold Gert-感谢您的帮助和澄清。我可以提出补充质询吗。是否可以跨不同项目中的实体创建外键,从而创建不同的数据库?谢谢