我在 ASP.NET 应用程序中更新断开连接的 POCO 模型时遇到问题。
假设我们有以下模型:
- 用户
- 区
- 订单
一个用户可以负责0个或多个区,一个订单属于一个区,一个用户可以是一个订单的所有者。
当用户登录时,加载相关的分区。稍后用户加载订单,并将自己设置为订单的所有者。用户(和相关地区)和订单(和相关地区)在两个不同的调用中加载,具有两个不同的 dbcontexts。当我在用户将自己分配给订单后保存订单时。我得到一个例外,说 acceptchanges 不能继续,因为对象的键值与另一个对象冲突。
这并不奇怪,因为同一个地区既可以出现在用户负责的地区列表中,也可以出现在订单上。
我一直在寻找解决这个问题的方法,但我找到的答案似乎是:
- 在我的情况下,不要加载对象之一的相关实体,这将是用户的区域。
- 不要使用对象将用户分配给订单,只需在订单对象上设置外键 id。
- 使用 nHibernate,因为它显然可以处理它。
我尝试了 1 并且可行,但我觉得这是错误的,因为我要么必须在将其与订单相关联之前加载没有其区域的用户,要么进行浅层克隆。这对于这里的这个简单案例来说很好,但问题是在我的案例中,区域可能会在图表中出现多次。而且这似乎毫无意义,因为我有对象,所以为什么不让我连接它们并更新图表。我需要订单的整个图表的原因是我需要向用户显示所有信息。所以既然我得到了所有的对象,为什么我需要重新加载或浅克隆它才能让它工作?
我尝试使用 STE,但遇到了同样的问题,因为我无法将对象附加到由另一个上下文加载的图形。所以我回到了广场1。
我认为这是除了教程代码之外的任何常见问题。然而,我似乎找不到任何好的解决方案。这让我觉得要么我在任何情况下都不理解使用 POCO/EF,要么我很讨厌使用谷歌来找到这个问题的答案。
我已经从 Julia Lerman 的 O'Reilly 购买了两本“Programming Entity Framework”书籍,但似乎也无法在这些书中找到任何解决我问题的方法。
有没有人可以阐明如何处理某些对象可能重复且不一定从同一上下文加载的图形。