在EF6中添加多对多表时出错

时间:2014-04-17 13:16:11

标签: asp.net-mvc entity-framework include many-to-many dbcontext

我最近通过升级到EF6使用EntityFramwework从ObjectContext更改为DbContext

大多数东西都有效,但保存和更新不会。这是一个例子:

public void AssignToAdmin(Product product, Admin admin)
{
    var pcsps = from s in context.ProductCreationSections
                join pcsp in context.ProductCreationSectionAndProducts on s.ProductCreationSecitionID equals pcsp.ProductCreationSectionID
                where pcsp.ProductID == product.ProductID && s.IsManagerAssigned
                select pcsp;

    foreach (var pcsp in pcsps.Include("AssignedAdmins"))
    {
        pcsp.AssignedAdmins.Add(admin);
    }
}

尝试执行第pcsp.AssignedAdmins.Add(admin)行,我收到错误:

  

错误:无法定义两个对象之间的关系   因为它们附加到不同的ObjectContext对象。

该类有一个context,它来自依赖注入(该类是MVC应用程序中的服务)。

我已尝试删除/附加等等,但这并没有解决它 - 它只是提供了不同的错误消息。它甚至不明显哪个实体正在使用另一个上下文。

错误消息引用的其他上下文的来源是什么?

2 个答案:

答案 0 :(得分:0)

请参阅The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects

admin 来自哪里? 从与 pcsp 对象相同的上下文中获取 admin 对象应该会有所帮助。

答案 1 :(得分:0)

对它进行排序,但这是一个非常重要的重构。

问题在于每个服务都收到了它自己的“上下文”实例,所以当两个服务中的两个实体预期一起工作时,它们就不会属于不同的上下文。

一种解决方案是将创建上下文的类设置为“Singleton”,以便它始终返回相同的实例,但这会非常糟糕,因为每个页面都会使用相同的上下文。

每个服务都通过依赖注入获得了它自己的'context'实例。 我改变了项目,所以只有控制器通过DI得到了一个上下文实例。然后,在控制器构造函数中,此上下文被传递给控制器​​通过依赖注入接收的服务。

这样,每个请求只使用一个上下文实例,但是这个实例仍然是短暂的,因为它应该是每个请求都有自己的上下文并且不共享一个。

不确定这是否应该如何工作,但鉴于我正在使用的网络应用程序,这似乎是最好的解决方案。

我还必须经历并添加'context.SaveChanges();'在任何地方都声明对数据库进行了更改。

当老版本的EF自动执行此操作时,不确定为什么会这样,但它现在可以正常工作。

感谢Derrick的建议