LINQ-to-SQL和多对多关系删除我有两个表之间的多对多关系,就说吧朋友和食物。如果朋友喜欢食物,我会像这样在FriendsFoods表中添加一行:IDFriendFood1'Tom''Pizza'FriendsFoods有一个主键'ID'和两个非空外键'Friend'和'Food'分别到“朋友”和“食物”表。现在假设我有一个与“Tom”相对应的Friendtom.NET对象,而Tom不再喜欢披萨(他怎么了?)FriendsFoodsff=tom.FriendsFoods.Where(x=>x.Food.Name=='比萨')。单身的();tom.FriendsFoods.Remove(ff);pizza.FriendsFoods.Remove(ff);如果我尝试在DataContext上提交SubmitChanges(),我会得到一个异常,因为它试图更改FriendsFoods表的Friend和Food列插入一个空值。我确信我可以组合一些复杂的逻辑来跟踪更改FriendsFoods表,拦截SubmitChanges()调用等。试图让SubmitChanges()以我想要的方式工作,但是有没有一种很好、干净的方法来删除LINQ-To-SQL多对多关系?假设数据库本身在外键上定义了一个CASCADEDELETE规则(否则你就有麻烦了),你需要在LinqtoSQL设计器中为每个与CASCADE的关系设置DeleteRule(或AssociationAttribute的DeleteRule)。您也不需要删除关联的两边-一个就足够了,无论是来自tom还是来自pizza。附录:@Crispy也是正确的,因为您关注的真实属性是子关联中的DeleteOnNull属性。但是,您在设计器中看不到这一点的原因是设计器会根据(a)父子关联的CASCADE设置以及(b)外键字段是否可为空来自动检测此属性的值或不。如果您在LinqtoSQL设计器中有一个带有CASCADEDELETE的不可空FK,它应该自动为子到父关联设置DeleteOnNull=true,然后从映射表中删除该记录,而不是尝试将其关联设置为NULL。如果您尝试通过从linq实体的FriendFoods中删除多对多表(FriendFoods)中的条目,则需要在DeleteOnNull文件中将关系上的DeleteOnNull属性设置为true。遗憾的是,您不能通过dbml设计器来完成此操作。您必须将.dbml文件作为xml文件打开并手动编辑关联的xml。请参阅如何从LINQtoSQL中删除子集合中的记录?CASCADEDELETE不适用于此处。它仅适用于删除实体的情况,即Friend对象或Food对象,但如果您只想删除关系则无效。您有什么理由不直接访问关系表吗?我认为这将是一个更清洁的解决方案。以上就是《C#学习教程:LINQ-to-SQL与多对多关系删除分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
