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();

b似乎在集合中生成了多个对数据库的“删除”sql调用tempA.B(有点奇怪,除非我错过了什么)。

所以,如果我有这 2 条记录的 AB 表 = { (1,2) , (1,3) } ,上面的代码会产生两个“删除” sql 调用(一个用于 b=2,另一个用于 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 解析所有内部引用并为它们中的每一个生成一个删除,而不是为所有它们生成一个删除。

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 回答