0

この質問は何度も聞かれることは知っていますが、変更されたフィールドを指定しているという事実は、私が解決するのを少し難しくしていると思います。これが私の更新方法です(リポジトリ内):

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

アタッチしようとすると「同じキーのオブジェクトが既に存在します」と表示されます。その行を削除すると、「「folder」タイプのエンティティはこのコンテキストに存在しません」というメッセージが表示されます。

これが私が(テストメソッド)からそれを呼んでいるところです:

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

なぜこれが起こっているのか考えていますか?

4

1 に答える 1

0

問題はおそらくここにあります: folderDto.ToEntity(). _dtoServices.AddFolderエンティティを作成Folderしてコンテキストに追加し、 を呼び出して、生成されたエンティティを返されたDTOにSaveChanges配置したと思います。エンティティはまだコンテキストにアタッチされており、状態になっています。IdhomeFolderFolderSaveChangesUnchanged

UpdateFolderを呼び出すことにより、から返されたのと同じ ID を持つfolderDto.ToEntity()新しいエンティティ インスタンスを作成します。次に、この新しいインスタンスを、同じキーを持つ古いインスタンスがまだ ==> 別の「同じキーを持つオブジェクト」 ==> 例外にアタッチされている同じコンテキストにアタッチします。var folder = new Folder...AddFolderAddFolder

新しいエンティティをアタッチする前に古いエンティティをデタッチするかFind、同じキーを持つエンティティがまだ存在しないかどうかを確認するために使用します。はいの場合、このエンティティを更新し、他のオブジェクトを添付しないでください。

于 2013-03-12T00:25:42.483 に答える