C# 如何删除与隐藏交集表的多对多关联中的记录?

C# 如何删除与隐藏交集表的多对多关联中的记录?,c#,entity-framework-6,C#,Entity Framework 6,我们有两个表,表1和表2,它们在SQL中定义,具有多对多关系 按照惯例,我们通过创建一个交集表table1\u table2来实现这一点,该交集表包含table1和table2的主键 我们已经从表1到表1\u表2以及从表2到表1\u表2创建了1-多个FK 然后我们让EF6使用从数据库导入创建一个EDMX 该模型定义了两个实体,表1和表2,具有多对多关系 也就是说,POCO类table1包含ICollection table2s,而类table2包含ICollection table1s 如何清除

我们有两个表,表1和表2,它们在SQL中定义,具有多对多关系

按照惯例,我们通过创建一个交集表table1\u table2来实现这一点,该交集表包含table1和table2的主键

我们已经从表1到表1\u表2以及从表2到表1\u表2创建了1-多个FK

然后我们让EF6使用从数据库导入创建一个EDMX

该模型定义了两个实体,表1和表2,具有多对多关系

也就是说,POCO类table1包含ICollection table2s,而类table2包含ICollection table1s

如何清除连接,以便删除表1的所有实例

这:

引发异常:

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的方法

它并不是太多的代码,如果需要的话,甚至可以进行推广

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

  • 加载导航集合
  • 并可能通过直接操纵
  • 或者你可以走了

    不是EF (如果可以接受的话,也可以硬编码)并使用纯SQL删除所有有问题的行

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


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

    如果不使用EF,可能会让您省去很多麻烦:)当我们完成当前的重构时,我们将能够通过Dapper或NHibernate在一个班级一个班级的基础上交换EF。但随着紧急但不重要的任务不断涌入,这将是一个漫长的过程。它有它的位置,但很多时候你并不需要它。只要不是超级复杂的图形,使用像dapper这样的工具时就会更加透明。
    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();
    }