【问题标题】:LINQ-To-SQL and Many-To-Many Relationship DeletionsLINQ-To-SQL 和多对多关系删除
【发布时间】:2010-04-02 20:47:17
【问题描述】:

我在两张表之间有一个多对多的关系,比如说 Friends 和 Foods。如果朋友喜欢某种食物,我会在 FriendsFoods 表中添加一行,如下所示:

ID Friend Food
1 'Tom' 'Pizza'

FriendsFoods 有一个主键“ID”,两个非空外键“Friend”和“Food”分别指向“Friends”和“Foods”表。

现在假设我有一个对应于“Tom”的Friend tom.NET 对象,而Tom 不再喜欢披萨(他怎么了?)

FriendsFoods ff = tom.FriendsFoods.Where(x => x.Food.Name == 'Pizza').Single();
tom.FriendsFoods.Remove(ff);
pizza.FriendsFoods.Remove(ff);

如果我尝试在 DataContext 上使用 SubmitChanges(),我会收到异常,因为它会尝试将 null 插入到 FriendsFoods 表中的 FriendFood 列中。

我确信我可以组合一些复杂的逻辑来跟踪FriendsFoods 表的更改,拦截SubmitChanges() 调用等,以尝试让它按照我想要的方式工作,但是有没有一个不错的,用 LINQ-To-SQL 删除多对多关系的干净方法?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    假设数据库本身在外键上定义了CASCADE DELETE 规则(否则你会遇到麻烦),你需要在 Linq to SQL 设计器中为每个关系设置删除规则(或AssociationAttribute) 中的DeleteRuleCASCADE

    您也不需要删除关联的双方 - 从 tompizza 删除一个就足够了。

    附录: @Crispy 也是正确的,您在这里关心的 real 属性是子关联中的 DeleteOnNull 属性。 然而,你在设计器中看不到这一点的原因是设计器根据(a)父到子的CASCADE设置自动检测到这个属性的值关联,以及 (b) 外键字段是否可以为空。如果您在 Linq to SQL 设计器中有一个带有 CASCADE DELETE 的不可空 FK,它应该自动为子父关联设置 DeleteOnNull = true,然后从映射表中删除记录,而不是尝试设置它的与NULL 的关联。

    【讨论】:

    • 这不会同时删除“Tom”和“Pizza”实体吗?
    • @Jake: 不,CASCADEFriendFriendsFoodsFoodFriendsFoods。写tom.FriendsFoods.Remove(ff)不会删除tom,也不会删除pizza条目。
    • 好的,这样就可以了。谢谢!我有点困惑,因为我把亲子关系倒在脑海里,但现在一切都说得通了。我最终在 SQL Server Management Studio 设计器中将删除规则设置为级联,因为我在 LINQ-To-SQL 设计器中找不到与删除规则相关的任何内容。
    【解决方案2】:

    如果您尝试通过将条目从 linq 实体的子集合中删除来从多对多表 (FriendFoods) 中删除条目,则需要在关系在 dbml 文件中等于 true。不幸的是,你不能通过 dbml 设计器来做到这一点。您必须将 .dbml 文件作为 xml 文件打开,然后手动编辑关联的 xml。

    How do I delete records from a child collection in LINQ to SQL?

    【讨论】:

      【解决方案3】:

      CASCADE DELETE 不适用于此处。它仅适用于删除实体的情况,无论是 Friend 对象还是 Food 对象,但如果您只是想删除关系则不适用。 您是否有任何理由不直接访问关系表?我认为这将是一个更清洁的解决方案。

      【讨论】:

        猜你喜欢
        • 2012-10-07
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-14
        • 1970-01-01
        • 2013-06-01
        • 2011-04-12
        • 1970-01-01
        相关资源
        最近更新 更多