Entity framework 实体框架:跨不同DBContext共享实体
我正在用EF6开发一个插件应用程序,代码优先 我有一个主上下文,其中有一个名为Entity framework 实体框架:跨不同DBContext共享实体,entity-framework,ef-code-first,entity-framework-6,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework 6,Entity Framework Migrations,我正在用EF6开发一个插件应用程序,代码优先 我有一个主上下文,其中有一个名为User的实体: public class MainDataContext : DbContext { public MainDataContext(): base("MainDataContextCS") {} public DbSet<User> Users { get; set; } } 当运行插件上下文的addmigration时,EF将尝试创建另一个名为PluginX.User的
User
的实体:
public class MainDataContext : DbContext
{
public MainDataContext(): base("MainDataContextCS") {}
public DbSet<User> Users { get; set; }
}
当运行插件上下文的addmigration
时,EF将尝试创建另一个名为PluginX.User
的User
实体
如何解决这个问题?是否有办法在另一个
DbContext
中共享公共实体?添加预订实体时,不要使用DbSet.add()
方法。而是使用DbSet.Attach()
方法,将预订的DbContext.Entry(Entity).State
属性设置为EntityState.Added
,并确保用户的DbContext.Entry(Entity).State
保持EntityState.Unchanged
因此,例如,不要这样做:
pluginDataContext.dbBooking.Add(myNewBooking);
这样做:
pluginDataContext.dbBooking.Attach(myNewBooking);
pluginDataContext.Entry(myNewBooking).State = EntityState.Added;
这是因为Add()
方法将对象图中的所有实体标记为EntityState.Added
,这将导致插入,而不检查数据库中是否已存在该实体。Attach()
方法只是让上下文开始跟踪实体
这就是为什么我几乎从不使用
DbSet.Add()
此解决方案可以帮助您:。但是,在这种情况下,两个上下文都在同一个项目中。我不知道它是否适用于两个不同项目中的上下文(我认为如果使用同一个类映射用户,它应该适用)。正如博客所说,当您为PluginX上下文运行addmigration
命令时,需要对生成的与Users表相关的代码进行注释 处理多个上下文时,有两个选项:
您可以尝试使用视图,将用户声明为PluginDataContext中的视图,并在执行迁移时键入“创建用户视图为…”方法,这样可以将书籍与用户关联起来。为什么不从MainContext继承PluginText。这也帮助我思考我的模型,并尝试对我的应用程序的某些部分进行反规范化。嘿,Franscesc,这个方法有什么变化吗?EF Core 3.0还不能跨上下文链接实体吗?我知道这很旧,但。。我一直认为这个解决方案一点都不好。每次添加新迁移时,您都必须“注释”代码?对我来说,这听起来像是个大难题。
pluginDataContext.dbBooking.Add(myNewBooking);
pluginDataContext.dbBooking.Attach(myNewBooking);
pluginDataContext.Entry(myNewBooking).State = EntityState.Added;