C# 如何删除与隐藏交集表的多对多关联中的记录?
我们有两个表,表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的所有实例 这: 引发异常: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 如何清除
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通常是一个不错的选择,但另一方面,它对于批量记录操作来说基本上太重了。如果不使用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();
}