2016-09-08 3 views
0

デタッチしたエンティティのリストを削除しようとしています。削除するエンティティは、例えば、他のエンティティ(外部キー)との関係を持っている:いくつかのケースではデタッチエンティティが同じ外部キーを共有しているがオブジェクトインスタンスが異なる場合、それらを削除する方法はありますか?

public class Foo 
{ 
    public int BarId {get;set;} 
    public virtual Bar Bar {get;set;} 
} 

は、2つのFooのエンティティが同じバーのIDを持っているかもしれません。しかし、これらは分離されたエンティティであり、コンテキストによって追跡されないため、2つのFooエンティティは2つの固有のBarエンティティを持ちます。

public virtual void Delete(T entity) 
{ 
    DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity); 

    if (dbEntityEntry.State != EntityState.Deleted) 
    { 
     dbEntityEntry.State = EntityState.Deleted; 
    } 

    else 
    { 
     dbSet.Attach(entity); 
     dbSet.Remove(entity); 
    } 
} 

これは、最初のFooエンティティのために動作します:私は(一般的なリポジトリクラスで)やってるのFooを削除するには

。バーが同じである他のFooエンティティのために、私は例外を取得:同じタイプの別のエンティティは、すでに仕事と同じ主キーの値

を持っているので、タイプのエンティティをアタッチ

に失敗しました私はを呼び出す前にFoo.Bar = nullと設定しています。これは正常に動作します。

ただし、コンテキストから複数のエンティティを削除する方が良いでしょうか?

+0

のように、あなたが直接SQL文を使用することができますエンティティを削除したい場合は、ASP.NET MVC [上の私の答えを見ているかもしれない - タイプのエンティティをアタッチ「MODELNAME」同じタイプの別のエンティティがすでに同じプライマリキー値を持っているために失敗しました](http://stackoverflow.com/questions/23201907/asp-net-mvc-attaching-anentity-of-type-modelname-failed- -another-ent/39557606#39557606)。 –

答えて

0

は次のように、取り付けない状態を設定してみてください:何をやっている

dataContext.Entry(entity).State = EntityState.Deleted; 

、エンティティの状態が既にDeletedにその状態を設定し、その後Deletedに設定されていないかどうかをチェックしているということです。これは問題ありませんが、エンティティの状態がすでにDeletedに設定されている場合は、添付して削除しようとしています。それは不要です。エンティティ状態がDeletedの場合、それはDetachedではないことを示します。再接続して再削除する必要はありません。

0

あなたはこの

dataContext.Database.ExecuteSqlCommand("delete from YOURTABLE where [email protected]", new SqlParameter("@id", entity.id)); 
関連する問題