我们有两个用SQL定义的表table1和table2,它们具有多对多关系。
通常,我们通过创建一个交集表table1_table2来实现此目的,该表包含table1和table2的主键。
我们已经创建了从表1到表1_table2以及从表2到表1_table2的1个FK。
然后我们让EF6使用从数据库导入的方式创建EDMX。
该模型定义了具有多对多关系的两个实体table1s和table2s。
也就是说,有一个POCO类table1包含一个ICollection table2s,而类table2包含一个ICollection table1s。
如何清除连接,以便删除表1的所有实例?
此:
using (var dbContext = new DbContext())
{
dbContext.table1s.RemoveRange(dbContext.table1s);
dbContext.SaveChanges();
}
引发异常:
System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_table1_table2_table1".
我首先尝试消除这种关系:
using (var dbContext = new DbContext())
{
foreach (var table1 in dbContext.table1s)
table1.table2s = null;
dbContext.table1s.RemoveRange(dbContext.table1s);
dbContext.SaveChanges();
}
我也遇到同样的异常。
所以我尝试显式删除每个table2记录:
using (var dbContext = new DbContext())
{
foreach (var table1 in dbContext.table1s)
{
foreach (var table2 in table1.table2.ToList()
{
table1.table2s.Remove(table2);
}
}
dbContext.table1s.RemoveRange(dbContext.table1s);
dbContext.SaveChanges();
}
这似乎行得通,但它是如此乏味,以至于我很难相信这就是我应该这样做的方式。
想法?
答案 0 :(得分:1)
好吧,这就是使用EF的方法。
这不是太多的代码,如果需要的话甚至可以泛化。
如果问题是性能,则可能由
部分解决或者你可以去
Get(more or less reliably) table name from its DbSet(如果可以接受,也可以对其进行硬编码),然后使用纯SQL删除所有有问题的行。
基本上使用正确的工具完成正确的工作。
EF通常是修改复杂对象图的不错选择,但另一方面,对于批量记录操作而言,它基本上太笨重了。