如何删除多对多关联中隐藏交集table的记录?
How to delete records in a many-to-many association with a hidden intersection table?
我们有两个 table,table1 和 table2,在 SQL 中定义,它们具有多对多关系。
按照惯例,我们通过创建一个交集 table、table1_table2 来实现它,其中包含 table1 和 table 的主键2.
我们创建了从 table1 到 table1_table2 和从 table2 到 table1_table2 的 1-many FK。
然后我们让 EF6 使用从数据库导入创建了一个 EDMX。
该模型定义了两个实体,table1s 和 table2s,具有多对多关系。
即有POCOclasstable1包含一个ICollectiontable2s,而classtable2包含一个ICollectiontable1s.
如何清除连接,以便删除 table1 的所有实例?
这个:
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();
}
这似乎行得通,但太乏味了,我很难相信这就是我应该做的事情。
想法?
EF
好吧,这就是使用 EF 的方法。
这并不是太多的代码,如果需要的话甚至可以概括。
如果问题是性能那么
可能会部分解决
- disabling automatic change detection
- eagerly 加载导航集合
- 并可能通过直接操纵 entry states.
或者你可以去
不是英孚
Get(more or less reliably) table name from its DbSet(或者如果可以接受的话只是硬编码)并删除所有带有普通 SQL.
的违规行
基本上是为正确的工作使用正确的工具。
EF 通常是修改复杂对象图的不错选择,但另一方面,对于批量记录操作来说,它基本上过于笨重。
我们有两个 table,table1 和 table2,在 SQL 中定义,它们具有多对多关系。
按照惯例,我们通过创建一个交集 table、table1_table2 来实现它,其中包含 table1 和 table 的主键2.
我们创建了从 table1 到 table1_table2 和从 table2 到 table1_table2 的 1-many FK。
然后我们让 EF6 使用从数据库导入创建了一个 EDMX。
该模型定义了两个实体,table1s 和 table2s,具有多对多关系。
即有POCOclasstable1包含一个ICollectiontable2s,而classtable2包含一个ICollectiontable1s.
如何清除连接,以便删除 table1 的所有实例?
这个:
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();
}
这似乎行得通,但太乏味了,我很难相信这就是我应该做的事情。
想法?
EF
好吧,这就是使用 EF 的方法。
这并不是太多的代码,如果需要的话甚至可以概括。
如果问题是性能那么
可能会部分解决- disabling automatic change detection
- eagerly 加载导航集合
- 并可能通过直接操纵 entry states.
或者你可以去
不是英孚
Get(more or less reliably) table name from its DbSet(或者如果可以接受的话只是硬编码)并删除所有带有普通 SQL.
的违规行基本上是为正确的工作使用正确的工具。
EF 通常是修改复杂对象图的不错选择,但另一方面,对于批量记录操作来说,它基本上过于笨重。