我在两个表之间存在多对多关系,比如说“朋友”和“食物”。如果朋友喜欢某种食物,我会在 FriendsFoods 表中插入一行,如下所示:
ID Friend Food
1 'Tom' 'Pizza'
FriendsFoods 有一个主键“ID”,以及分别指向“Friends”表和“Foods”表的两个非空外键“Friend”和“Food”。
现在假设我有一个Friend tom
.NET 对象对应于“Tom”,并且 Tom 不再喜欢披萨(他出了什么问题?)
FriendsFoods ff = tom.FriendsFoods.Where(x => x.Food.Name == 'Pizza').Single();
tom.FriendsFoods.Remove(ff);
pizza.FriendsFoods.Remove(ff);
如果我尝试SubmitChanges()
在 DataContext 上,我收到一个异常,因为它尝试将 null 插入到Friend
and Food
中的列FriendsFoods
table.
我确信我可以组合某种复杂的逻辑来跟踪FriendsFoods
表,截距SubmitChanges()
调用等来尝试让它按照我想要的方式工作,但是有没有一种好的、干净的方法来删除与 LINQ-To-SQL 的多对多关系?
假设数据库本身有CASCADE DELETE
外键上定义的规则(否则你就会遇到麻烦),你需要设置删除规则Linq to SQL 设计器中的每个关系(或DeleteRule
in the AssociationAttribute
) to CASCADE
.
您也不需要删除关联的两侧 - 一侧就足够了,无论是从tom
或来自pizza
.
附录: @Crispy也是正确的,因为real你关心的属性是DeleteOnNull
子关联中的属性。However,您在设计器中看不到此属性的原因是设计器根据 (a) 自动检测此属性的值CASCADE
父子关联的设置,以及 (b) 外键字段是否可以为空。如果您有一个不可为空的 FKCASCADE DELETE
在 Linq to SQL 设计器中,它应该自动设置DeleteOnNull = true
对于子到父关联,然后从映射表中删除该记录,而不是尝试将其关联设置为NULL
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)