实体框架:在不同的DbContext中共享实体

tggm

我正在使用EF6开发一个插件应用程序,首先编写代码。

我有一个与实体有关的主要上下文User

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

然后是另一个项目的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; }
}

这样就可以在同一数据库(相同的连接字符串)上巧妙地创建PluginX.Bookings表。

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

public class Booking
{
    public int Id { get; set;}
    public virtual User CreationUser { get; set;}
    public BookingStatus Status { get; set; }
}

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

如何解决呢?有没有一种方法可以共享一个公共实体DbContext

弗朗切斯·卡斯特尔(Francesc Castells)

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

  1. 将每个上下文视为独立的应用程序。假设您的用户是从Web服务获得的外部资源。您将无法为其添加外键。您要做的就是要么仅在表中添加userId,然后在需要用户详细信息时调用外部服务以获取它们,要么在Bookings上下文中拥有该用户的本地轻量副本,您将不时更新从用户上下文中。当您使用大型系统并希望隔离各个部分时,此方法非常有用(了解有关DDD和有界上下文的信息)
  2. 除了您的2个上下文外,还使用整个模型(用户,预订等)创建第三个上下文。您将使用完整的上下文来创建迁移并维护数据库结构,但是在应用程序中,您将使用较小的上下文。这是一个非常简单的解决方案。使用单个上下文维护迁移很容易,并且仍然可以让您在无法访问无关实体的较小上下文中隔离数据库操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章