【问题标题】:An object with the same key already exists in the ObjectStateManager (with specified fields)ObjectStateManager 中已存在具有相同键的对象(具有指定字段)
【发布时间】:2013-03-11 02:53:09
【问题描述】:

我知道这个问题已经被问过很多次了,但我认为我指定修改字段的事实让我更难解决。这是我的更新方法(在存储库中):

        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;
    }
 }

知道为什么会这样吗?

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework web-applications


    【解决方案1】:

    问题很可能在这里:folderDto.ToEntity()。我猜你在_dtoServices.AddFolder 中创建了一个Folder 实体并将其添加到上下文中,然后调用SaveChanges,然后将生成的Id 放在返回的homeFolder DTO 中。实体Folder 仍附加到上下文,在SaveChanges 之后处于Unchanged 状态。

    UpdateFolder 中,通过调用folderDto.ToEntity() 创建一个新的实体实例var folder = new Folder...,其ID 与从AddFolder 返回的相同。然后将此新实例附加到相同的上下文中,其中来自 AddFolder 的具有相同键的旧实例仍附加到 ==> 另一个“具有相同键的对象”==> 异常。

    在附加新实体之前分离旧实体,或者使用Find 检查是否还没有具有相同密钥的实体。如果是,请更新 实体并且不要附加其他对象。

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多