我想在我的ASP.NET MVC应用程序添加功能改变我的数据结构的一些领域。单击窗体上的提交按钮后,下面的动作称为:EF4对象状态管理器中声称多个条目连接时,有没有
[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)
呼叫。我错过了什么吗?
作为供参考,这个系统曾经工作,但似乎已经打破它的是我从模型第一次转换为代码第一次与POCO(最新CTP)。除了这种情况外,我所有其他的功能都像以前一样工作。
public ObjectSet<T> CreateObjectSet<T>() where T : class
{
return ObjectContext.CreateObjectSet<T>();
}
编辑: 四处寻找我的代码由于意见后
如果有帮助,我的通用仓库通过我在上下文类写了一个函数从DbContext
得到ObjectSet
我只记得我已经实现了一个用于上下文管理的单例。我这样做是因为控制器可能从一个服务类获得实体,并使用另一个服务类来更新它(我想这是我试图解决的情况,我刚才实现了它,当我下班时,d必须看起来更近)。
我为此使用了一个单例,因为我有这样的印象,即单例不会跨越多个http请求,并且我认为这可能是问题。当我回家时我会看这个。
是,该代码看起来不错。很可能你没有正确地管理OC的生命周期。 – RPM1984 2010-10-29 06:03:02