.net - LINQ 到 SQL。级联删除模拟

标签 .net linq linq-to-sql

我在人和地址之间有多对多的关系

Person { Id, ... }
Address { Id, ... }
Address2Person { Id, PersonId, AddressId }

DBML 生成的类看起来像(图中有 PK 和 FK):
class Person {
  Id, Address2Person 
}

class Address2Person {
  Id, Person, PersonId, Address, AddressId
}

class Address {
  Id, Address2Person
}

当我删除 person 时,我必须删除 AddressPerson 行(这很容易)以及适当的 Address 行,但前提是没有对 address 的外部引用,除非删除一个。

在数据库级别实现级联删除可能更聪明,但我如何在纯 LINQ 2 SQL 中模拟这一点?

最后我编写了这样的代码:
// finding out addresses to delete
var addressesToDelete = 
  (from ap in DataBase.Address2Person
    group ap by ap.Address
    into g
      where g.All(x => x.PersonId == personId2Delete)
        select g.Key).ToList();

// killing references
DataBase.Address2Person.DeleteAllOnSubmit(
    DataBase.Address2Person.Where(x => x.PersonId == personId2Delete));

// killing addresses
DataBase.Address.DeleteAllOnSubmit(addressesToDelete);

有没有更好的办法?

先感谢您!

最佳答案

如果您的规则是不能有孤立地址,您可能会从以下顺序获得更好的性能和更容易的代码维护:

DataBase.Address2Person.DeleteAllOnSubmit(
    DataBase.Address2Person.Where(x => x.PersonId == personId2Delete));
DataBase.Address.DeleteAllOnSubmit(
    DataBase.Address.Where(x => !x.Address2Person.Any());

关于.net - LINQ 到 SQL。级联删除模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172750/

相关文章:

c# - LINQ 更新表 1 中的列与表 2 中电子邮件匹配的 id?

c# - 如何强制 Linq 更新一行的上次编辑时间?

c# - 如何在 LINQ 中分组然后选择元素到新类中(最好是 C#)

c# - 不合格的类名与系统命名空间中的新 .NET 类发生冲突

c# - 使用 linq 的集合列表到分组集合列表

c# - 比较两个复杂对象的相等性

c# - LINQ 是否可以动态添加 where 子句

linq-to-sql - Linq to SQL 或 Linq to Entities 4.0 是否支持hierarchyid 数据类型

c# - 如何在 WebBrowser 控件中注入(inject) Javascript?

c# - .NET 如何确定字符的 Unicode 类别?