2013-03-11 89 views
0

我知道這個問題已經被問了很多次,但我認爲我指定修改字段的事實使它變得更難一些我解決。這是我的更新方法(在庫):ObjectStateManager中已存在具有相同鍵的對象(具有指定的字段)

 public Folder UpdateFolder(Folder folder) 
     { 
      _db.Folders.Attach(folder); // error happens here 
      var entry = _db.Entry(folder); 
      entry.Property(e => e.Title).IsModified = true; 
      SaveChanges(); 
      return entry.Entity; 
     } 

我得到「具有相同鍵的對象已存在」當我嘗試連接。如果我刪除該行,則會得到「此文本中不存在」文件夾類型的實體「。

這裏就是我從(測試方法)調用它:

 homeFolder = _dtoServices.AddFolder(new FolderDto 
      { 
       Title = "Home Folder" 
      }); 
     Assert.AreEqual(_dtoServices.GetHomeData().TotalFolders, 1); 

     // Check Folder 
     Assert.AreEqual(_dtoServices.GetFolder(homeFolder.FolderId).Details, "Home Folder"); 

     // Update Folder, Check Folder 
     homeFolder.Title = "Updated"; 
     _dtoServices.UpdateFolder(homeFolder); // HERE 
     Assert.AreEqual(_dtoServices.GetFolder(homeFolder.FolderId).Details, "Updated"); 

在我DtoServices:

 public FolderDto UpdateFolder(FolderDto folderDto) 
     {  
      var test = _repository.UpdateFolder(folderDto.ToEntity()); 
      return null; 
     } 

在我FolderDto:

public class FolderDto 
{ 
    public FolderDto() 
    { 
    } 

    public FolderDto(Folder folder) 
    { 
     FolderId = folder.FolderId; 
     Title = folder.Title;   
    } 

    [Key] 
    public int FolderId { get; set; } 

    [Required] 
    public string Title { get; set; } 

    public Folder ToEntity() 

    { 
     var folder = new Folder 
     { 
      FolderId = FolderId, 
      Title = Title, 
     }; 
     return folder; 
    } 
} 

知道爲什麼這發生了什麼?

回答

0

問題很可能出在這裏:folderDto.ToEntity()。我猜你在_dtoServices.AddFolder中創建了Folder實體並將其添加到上下文中,然後調用SaveChanges,然後將生成的Id放入返回的homeFolder DTO中。實體Folder仍附加到上下文中,並在SaveChanges狀態Unchanged之後。

UpdateFolder通過調用folderDto.ToEntity()您創建一個新的實體實例var folder = new Folder...與您從AddFolder返回的相同的Id。然後,將這個新實例附加到同一個上下文中,其中具有相同鍵的AddFolder的舊實例仍然附加到==>另一個「具有相同鍵的對象」==>異常。

在附加新實體之前分離舊實體,或使用Find檢查是否還沒有具有相同密鑰的實體。如果是,則更新實體,並且不附加其他對象。

相關問題