我正在使用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
中共享一个公共实体?
当使用多个上下文时,有两个选择:
添加预订实体时,请勿使用DbSet.Add()
方法。而是使用DbSet.Attach()
方法,并将预订的DbContext.Entry(Entity).State
属性设置为EntityState.Added
,并确保用户的DbContext.Entry(Entity).State
保持EntityState.Unchanged
。
此解决方案可以为您提供帮助:Entity Framework 6 Code First Migrations with Multiple Data Contexts。但是,在这种情况下,两个上下文都在同一个项目中。我不知道是否可以在两个不同项目中使用上下文(如果您使用相同的类来映射User,我认为应该这样做)。正如博客所说,在为PluginX Context运行Add-Migration
命令时,需要注释与Users表相关的生成代码。