2017-04-20 24 views
1

私はこのコードを削除でAsNoTrackingと削除が

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
    Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

usinデータベースから行を削除しようとしている私は、このエラーを持っている

はSystem.InvalidOperationExceptionが:それがあったため、オブジェクトを削除することはできませんObjectStateManagerには見つかりません。タイプのエンティティを取り付け 'Album.DatabaseContext.ListPicture'

のSystem.InvalidOperationException:

私は、これはエラーがある画像

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

に取り付けられたエンティティPICに試み同じタイプの別のエンティティがすでに同じプライマリキー値を持っているため、失敗しました。

機能GetPicture

が、私はこの問題

+0

どのようにしてEFコンテキストに画像を添付しようとしましたか? –

+0

私はアタッチコード – melom

答えて

1

まあを解決する方法を、自分のアプリケーションで何度も使用され、明らかに実体は、文脈で追跡(ロード)する必要があります。 (それが掲示コードから思えるように)することができます

ListPicture pic = Pictures.FirstOrDefault(x => x.pId == Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

またはPictures場合DbSet<T>です:

だからどちらかがGetPicture方法(私が知っている、コードの重複けど...)を使用していません代わりFind方法を使用:

ListPicture pic = Pictures.Find(Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

両方のアプローチが返さインスタンスはコンテキストに取り付けられるようになります。

+0

を追加しました。これは私が思ったものです。私はコードを複製したくありませんでした - ありがとう – melom

0

AsNoTrackingを使用すると、EFはプロキシに読み込まれたエンティティのデータを保持しません。つまり、EFに何も依存しなくなったエンティティです。

ただし、このエンティティはデータベースに存在します。 Attachを実行しようとすると、EFは同じIdを持つ人物がすでに存在することを確認し、例外をスローします。

私の提案は次のとおりです。

1:GetPictureメソッドからAsNoTrackingを削除します。 2:あなたができない場合は、このようなあなたのDeleteメソッド作る:あなたはそれが付属しないか(、あなたはそれがいずれか、または可能性が取得している例外に基づいて)されるかどうかわからない場合は

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = Pictures.Find(id); 
    if(pic != null) 
    { 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 
0

DbContextインスタンスにチェックを付けて、それが接続されているかどうかを確認し、接続されていない場合は接続できます。これには、使用されているDbContextインスタンスへのアクセスが必要です。

また、添付のエンティティを返すようにして、AsNoTracking()を使用しないでください。

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     // add check if instance is attached 
     if(contextInstance.Entry(pic).State == System.Data.Entity.EntityState.Detached) 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); // this could be moved to inside the if block 
} 
関連する問題