Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架:跨不同DBContext共享实体_Entity Framework_Ef Code First_Entity Framework 6_Entity Framework Migrations - Fatal编程技术网

Entity framework 实体框架:跨不同DBContext共享实体

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的

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

我有一个主上下文,其中有一个名为
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表相关的代码进行注释

处理多个上下文时,有两个选项:

  • 将每个上下文视为单独的应用程序。假设您的用户是从web服务获得的外部资源。您将无法向其添加外键。在这种情况下,您可以只在表中添加userId,并在需要用户详细信息时调用外部服务获取它们,或者在Bookings上下文中创建用户的本地light副本,您可以不时从Users上下文中更新该副本。当您使用大型系统并且希望隔离各个部分时,这种方法很好(请阅读DDD和有界上下文)
  • 除了你的两个上下文之外,用整个模型(用户、预订等)创建第三个上下文。您将使用完整的上下文来创建迁移和维护数据库结构,但在应用程序中,您将使用较小的上下文。这是一个非常简单的解决方案。使用单个上下文很容易维护迁移,而且它仍然允许您在无法访问无关实体的较小上下文中隔离DB操作

  • 您可以尝试使用视图,将用户声明为PluginDataContext中的视图,并在执行迁移时键入“创建用户视图为…”方法,这样可以将书籍与用户关联起来。

    为什么不从MainContext继承PluginText。这也帮助我思考我的模型,并尝试对我的应用程序的某些部分进行反规范化。嘿,Franscesc,这个方法有什么变化吗?EF Core 3.0还不能跨上下文链接实体吗?我知道这很旧,但。。我一直认为这个解决方案一点都不好。每次添加新迁移时,您都必须“注释”代码?对我来说,这听起来像是个大难题。
    pluginDataContext.dbBooking.Add(myNewBooking);
    
    pluginDataContext.dbBooking.Attach(myNewBooking);
    pluginDataContext.Entry(myNewBooking).State = EntityState.Added;