【发布时间】:2013-03-28 01:56:30
【问题描述】:
我首先使用 EF 5 数据库编写 MVC 4 Web 应用程序。我有一些明显微不足道的问题,我找不到合适的解决方案。这些问题与对象状态管理器有关。
在最简单的场景中,一切正常:我使用 Find 从数据库中读取实体,将它们放入视图中,等待响应,重构实体,使用 Attach、EntityState.Modified 和 SaveChanges 将其写回。如果在处理请求时,我再次从数据库中获取实体,则会出现问题。
如果出现以下情况,我会这样做:
1. 由于某种原因,我想检查原始实体的一些值。
2. 我的一些值不能被修改,因为它们标识了实体。我将这些放在我的视图中仅供参考,使用 DisplayFor。当然,重构模型没有这些值。我从数据库中获取原始实体,并在控制器中使用 TryUpdateModel 将其与视图中的模型合并。
调用 Attach 时出现异常“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”。
如果我使用Context.Entry(t).CurrentValues.SetValues(t); 而不是DbSet.Attach(t);,我会得到以下异常:
Member 'CurrentValues' cannot be called for the entity of type 'Price' because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Price>.
据我了解,具有特定键的实体有两个实例。我想做一个我想保存的,替换现在的一个,如果有的话。我希望这是自动的,也就是说,我不必告诉是否已经存在另一个必须更换的。
有没有办法做到这一点?
【问题讨论】:
-
plaese,有没有人解决这个问题。我为同样的问题发疯了
-
我从来没有真正解决过它。相反,在某些情况下,我会创建另一个上下文。 An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. 提供了一个可能的解决方案,我没有验证。我认为这个问题与 Dynamic Proxies 的使用有关,所以也许寻找更多关于这方面的信息,也可以帮助你。
-
这是我做的同样的快速'n'dirty技巧
-
我也遇到了同样的问题 :(
-
@GMan,我收到了您的 cmets 通知,并添加了我对这个问题的回答。希望对您有所帮助!
标签: entity-framework modelstate