实体框架:跨不同的DbContexts共享实体

tgg*_*ggm 10 entity-framework ef-code-first ef-migrations entity-framework-6

我正在使用EF6开发一个插件应用程序,代码优先.

我有一个主要的上下文与一个名为的实体User:

public class MainDataContext : DbContext
{
    public MainDataContext(): base("MainDataContextCS") {}
    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后是PluginX的另一个上下文,在另一个引用基类的项目上:

public class PluginDataContext : DbContext
{
    public PluginDataContext () : base("MainDataContextCS") {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.HasDefaultSchema("PluginX");
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<Booking> Bookings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这可以在同一个数据库(相同的连接字符串)上整齐地创建PluginX.Bookings表.

这里的问题是Booking实体包含对实体的引用User:

public class Booking
{
    public int Id { get; set;}
    public virtual User CreationUser { get; set;}
    public BookingStatus Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当运行Add-Migration插件上下文时,EF将尝试创建另一个User名为的实体PluginX.User.

怎么解决这个问题?有没有办法在另一个实体中共享一个共同的实体DbContext

Fra*_*lls 7

当您使用多个上下文时,您有两个选择:

  1. 将每个上下文视为单独的应用程序.想象一下,您的用户是您从Web服务获得的外部资源.您将无法为其添加外键.你要做的就是在表中只添加userId,当你需要用户详细信息时,调用外部服务来获取它们,或者在Bookings上下文中有一个本地的用户副本,你会不时地更新来自Users上下文.当您使用大型系统并且想要隔离部件时,这种方法很好(阅读有关DDD和有界上下文的信息)
  2. 来自您的2个上下文的一部分,使用整个模型(用户,预订等)创建第三个上下文.您将使用完整上下文来创建迁移并维护数据库结构,但在应用程序中,您将使用较小的上下文.这是一个非常简单的解决方案.使用单个上下文维护迁移很容易,它仍然允许您在无法访问不相关实体的较小上下文中隔离数据库操作.