1

次の Update メソッドがあります。

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

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

次に、次のことを試します。

    public Folder UpdateFolder(Folder folder)
    {


        var entry = _db.Entry(folder);
        entry.State= EntityState.Detached;
        _db.Folders.Attach(folder);

        entry.Property(e => e.Title).IsModified = true;

また、Attach への呼び出しを実行すると、同じエラーが発生します。

ここから呼び出しています(テストメソッド):

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

なぜこれが起こっているのですか?update メソッドのより堅牢なチェックを作成するにはどうすればよいですか? 私は周りを検索しましたが、決定的なものは何も見つかりません。

4

1 に答える 1

0

エンティティがまだアタッチされていないことを確認する必要があります。私はこのようなことをします (TEntity : クラス):

...
//See if entity is attached already and return if so.    
TEntity attached = GetAttached(entityToUpdate);

if(attached == null)
{
  //Entity is not attached, attach it.
}      
...

//Generic helper to check for attached entity
private TEntity GetAttached(TEntity aEntity)
{
  var lObjectContext = ((IObjectContextAdapter)context).ObjectContext;
  EntityKey lKey = GetEntityKey(aEntity);

  ObjectStateEntry entry;
  if (!lObjectContext.ObjectStateManager.TryGetObjectStateEntry(lKey, out entry)) return null;

  if (entry.State == EntityState.Detached) return null;

  return (TEntity)entry.Entity;
}
于 2013-03-12T04:34:32.730 に答える