Linq-to-sql删除具有FK约束的记录

时间:2011-09-22 19:21:19

标签: c# .net linq linq-to-sql

是否可以SubmitChanges并忽略导致外键约束错误的删除?

说我有对象A和B. B的主键是A中的外键。现在我更改了一个记录A,其中我将B替换为另一个B并删除原始B.当删除的B是在另一个记录A(或其他包含B作为外键的表)中引用。是否可以忽略错误并让更改在数据库中进行,而不删除旧B?

A rec_a = (from a in db.As where a.id == some_id).First();
B rec_b_old = rec_a.B;
rec_a.B = null;
db.Bs.DeleteOnSubmit(rec_b_old);
rec_a.B = some_other_b;
db.SubmitChanges();

2 个答案:

答案 0 :(得分:4)

拨打SubmitChanges()两次电话:

A rec_a = (from a in db.As where a.id == some_id).First();
B rec_b_old = rec_a.B;
rec_a.B = null;
rec_a.B = some_other_b;
db.SubmitChanges();
db.Bs.DeleteOnSubmit(rec_b_old);
try
{
    db.SubmitChanges();
}
catch(SqlException) { } // Ignore failed delete.

第二个可能会失败,在这种情况下只是忽略它。可以尝试提交所有内容,挖掘失败的更新/删除,将其从待处理列表中删除并重试。但是它需要更多的代码,所以我认为不值得在这里做。

另一种解决方案是在A表上放置一个触发器,如果​​它是孤立的,则删除B记录。

答案 1 :(得分:0)

LINQ to SQL不支持级联删除操作。您需要告诉数据库本身这样做或者首先自己删除子行。

有关详细说明,请参阅Insert, Update, and Delete Operations (LINQ to SQL)