我试图在我的ASP.NET MVC应用程序中添加功能,以更改数据结构的某些字段。单击表单上的提交按钮后,将执行以下操作:
[HttpPost]
public ActionResult Edit(Document doc)
{
// Attempt to save the project
if (_documentService.SaveDocument(doc) == ServiceActionResult.Success)
return RedirectToAction("List");
else
return View();
}
SaveDocument()
方法如下所示: public ServiceActionResult SaveDocument(Document doc)
{
if (doc == null)
return ServiceActionResult.ActionFailure;
// Check if this is a new Document (null ID)
if (doc.Id == 0)
_documentRepository.Add(doc);
else
_documentRepository.Attach(doc);
_documentRepository.SaveChanges();
return ServiceActionResult.Success;
}
由于文档存在(因此具有Id值),因此我调用通用存储库的
Attach()
方法。 attach方法如下所示: public void Attach(T entity)
{
_objectSet.Attach(entity);
}
调用对象集的
Attach()
方法时,会发生以下异常:An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
我不明白为什么会这样,因为您可以看到请求的整个生命周期只有一个EF调用,这就是最后的
Attach(entity)
调用。我想念什么吗?作为FYI,该系统曾经可以运行,但似乎中断了我使用POCO(最新CTP)从模型优先转换为代码优先的工作。除了这种情况外,我所有其他功能都像以前一样工作。
如果有帮助,我的通用存储库将通过我在上下文类中编写的函数从
ObjectSet
获取DbContext
: public ObjectSet<T> CreateObjectSet<T>() where T : class
{
return ObjectContext.CreateObjectSet<T>();
}
编辑:
在查看了由于注释而引起的代码后,我只记得我为上下文管理实现了一个单例。我之所以这样做,是因为Controller可能会从一个服务类中获取实体,然后使用另一服务类来对其进行更新(我认为这是我要解决的情况,我前一阵子实现了, d,下班后必须靠近看)。
我之所以使用单例,是因为我的印象是单例不会遇到多个http请求,而我的评论认为这可能是问题所在。到家后我会看看这个。
最佳答案
RE:如您所见,请求的整个生命周期只有一个EF调用
从显示的代码中我们可以看到,ObjectContext生存期可以是应用程序的生存期。如果是这样,那么这可能就是这里的问题。
您能解释一下如何管理ObjectContext生存期吗..是否每个Http请求都可以?
关于c# - EF4对象状态管理器声称在没有条目时附加了多个条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4048411/