0

2 つのエンティティ:A *<-->* B 多対多の関係と対応する 3 つのテーブル:を持つA, B, AB

次のコードを試してください:

 var tempA = this.dbContext.A.
                  .Where(a => a.UID == 1)
                  .FirstOrDefault();

 // {check for null here}

 tempA.B.Clear();

 this.dbContext.SaveChanges();

データベースへの複数の「削除」SQL呼び出し、コレクション内のfor-eachを生成するようですbtempA.B何かを見逃さない限り、やや奇妙です)。

したがって、これらの 2 つのレコード = { (1,2) , (1,3) } を持つ AB テーブルがある場合、上記のコードは 2 つの「削除」SQL 呼び出しを生成します (1 つは b=2 用、もう 1 つは b=3 用)。このようなもの:

 1. DELETE FROM AB WHERE (A_UID = 1) AND (B_UID = 2)
 and 
 2. DELETE FROM AB WHERE (A_UID = 1) AND (B_UID = 3) 

しかし、以下のような単純なものを生成できる EF コードが必要ですか?

 DELETE FROM AB WHERE (A_UID = 1) 

編集: EF がすべての内部参照を解析し、それらのすべてに対して 1 つの削除ではなく、それぞれに対して 1 つの削除を生成する理由がわかりません。

4

2 に答える 2

2
dbContext.Database.ExecuteSqlCommand("DELETE FROM AB WHERE (A_UID = 1)");

単一の SQL コマンドでこれを実現する唯一の方法です。EF は、関連エンティティのすべてまたは一部のみをロード/アタッチしたかどうかを追跡しません。Clearこのような状況で呼び出すことができます...

var tempA = new A { UID = 1, B = new List<B>() }
tempA.B.Add(new B { UID = 2 });

using (var dbContext = new MyContext())
{
    dbContext.A.Attach(tempA);
    tempA.B.Clear();
    dbContext.SaveChanges();
}

...この場合、A.UID = 1 の結合テーブルからすべてのエントリを削除するのは間違っています。コレクションをクリアすると、B.UID = 2 のエンティティのみが削除され、B.UID = 3 のエンティティは削除されないためです。

于 2013-08-26T13:01:43.537 に答える
0

次のようなことをしてみませんか:

var temp = this.dbContext.AB.Where(ab => ab.A.UID == 1 && ab.B.UID == 2);
temp.Clear();

私はそれをテストしませんでしたが、これでより良いアイデアが得られるでしょうか?

于 2013-08-26T12:17:29.470 に答える