如何删除多对多关联中隐藏交集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 的方法。

这并不是太多的代码,如果需要的话甚至可以概括。

如果问题是性能那么

可能会部分解决
  1. disabling automatic change detection
  2. eagerly 加载导航集合
  3. 并可能通过直接操纵 entry states.

或者你可以去

不是英孚

Get(more or less reliably) table name from its DbSet(或者如果可以接受的话只是硬编码)并删除所有带有普通 SQL.

的违规行

基本上是为正确的工作使用正确的工具。

EF 通常是修改复杂对象图的不错选择,但另一方面,对于批量记录操作来说,它基本上过于笨重。