我最近通过升级到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应用程序中的服务)。
我已尝试删除/附加等等,但这并没有解决它 - 它只是提供了不同的错误消息。它甚至不明显哪个实体正在使用另一个上下文。
错误消息引用的其他上下文的来源是什么?
答案 0 :(得分:0)
admin 来自哪里? 从与 pcsp 对象相同的上下文中获取 admin 对象应该会有所帮助。
答案 1 :(得分:0)
对它进行排序,但这是一个非常重要的重构。
问题在于每个服务都收到了它自己的“上下文”实例,所以当两个服务中的两个实体预期一起工作时,它们就不会属于不同的上下文。
一种解决方案是将创建上下文的类设置为“Singleton”,以便它始终返回相同的实例,但这会非常糟糕,因为每个页面都会使用相同的上下文。
每个服务都通过依赖注入获得了它自己的'context'实例。 我改变了项目,所以只有控制器通过DI得到了一个上下文实例。然后,在控制器构造函数中,此上下文被传递给控制器通过依赖注入接收的服务。
这样,每个请求只使用一个上下文实例,但是这个实例仍然是短暂的,因为它应该是每个请求都有自己的上下文并且不共享一个。
不确定这是否应该如何工作,但鉴于我正在使用的网络应用程序,这似乎是最好的解决方案。
我还必须经历并添加'context.SaveChanges();'在任何地方都声明对数据库进行了更改。
当老版本的EF自动执行此操作时,不确定为什么会这样,但它现在可以正常工作。
感谢Derrick的建议