我正在首先使用EF 5数据库编程一个MVC 4网络应用程序。我有一些看似微不足道的问题,但我找不到合适的解决方案。这些问题与对象状态管理器有关。
在最简单的场景中,一切都很好:我使用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>.
据我所知,有两个实体实例具有特定的密钥。如果有的话,我想做一个我想保存的,代替现在的。我希望这是自动的,也就是说,不必告诉我是否已经有另一个必须更换的。
有办法做到这一点吗?