2010-10-29 7 views
3

我想在我的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请求,并且我认为这可能是问题。当我回家时我会看这个。

+0

是,该代码看起来不错。很可能你没有正确地管理OC的生命周期。 – RPM1984 2010-10-29 06:03:02

回答

3

RE:你可以看到该请求的整个生命周期只有一个调用EF

据从代码所示,我们可以看到,ObjectContext的寿命可能是一辈子的应用程序。如果是这样,那么这可能是问题。

你能解释一下你是如何管理ObjectContext生命周期的。它是根据Http Request吗?

+0

我不知道你将如何有一个ObjectContext的持续超过一个Http请求,这样可能是一个问题,但我怎么会想出我的ObjectContext一辈子? – KallDrexx 2010-10-29 14:10:07

+0

你可以发表你如何创建CreateObjectSet 使用的ObjectContext的代码()。它什么时候被创建和发布? – 2010-10-29 14:36:42

+0

我只是在快速查看我的对象上下文代码后更新了原始问题。在你的评论之后,我感觉这是因为我使用单例模式来创建对象上下文,所以我有一种感觉,我不得不改变它。 – KallDrexx 2010-10-29 14:43:16

相关问题