如何删除与隐藏的相交表在多对多关联中的记录?

时间:2019-05-06 20:34:16

标签: c# entity-framework-6

我们有两个用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();
}

这似乎行得通,但它是如此乏味,以至于我很难相信这就是我应该这样做的方式。

想法?

1 个答案:

答案 0 :(得分:1)

EF

好吧,这就是使用EF的方法。

这不是太多的代码,如果需要的话甚至可以泛化。

如果问题是性能,则可能由

部分解决
  1. disabling automatic change detection
  2. eagerly加载导航集合
  3. ,并且可能直接操作entry states

或者你可以去

不是EF

Get(more or less reliably) table name from its DbSet(如果可以接受,也可以对其进行硬编码),然后使用纯SQL删除所有有问题的行。

基本上使用正确的工具完成正确的工作。

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