我试图在我的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/

10-13 06:45