2013-03-11 87 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检查是否还没有具有相同密钥的实体。如果是,则更新实体,并且不附加其他对象。

相关问题