gpt4 book ai didi

.net - 使用 Linq To SQL 更新多对多关系

转载 作者:行者123 更新时间:2023-12-04 06:55:33 26 4
gpt4 key购买 nike

例如,如果我在用户和角色表之间有一个名为“RolesToUsers”的多对多映射表,那么我是这样做的:

// DataContext is db, usr is a User entity
// newUserRolesMappings is a collection with the desired new mappings, probably
// derived by looking at selections in a checkbox list of Roles on a User Edit page
db.RolesToUsers.DeleteAllOnSubmit(usr.RolesToUsers);
usr.RolesToUsers.Clear();
usr.RolesToUsers.AddRange(newUserRolesMappings);

我曾经使用过 SQL 探查器,这似乎生成了非常智能的 SQL - 它只会删除不再存在于映射关系中的行,并且只添加关系中不存在的行。它并没有像我想象的那样盲目地对关系进行彻底的清理和重建。

互联网在这个主题上出奇地安静,而查询“LinqToSQL 多对多”大多只是出现关于 LinqToSQL 数据映射器如何不很好地“支持”它的文章。

其他人如何使用 LinqToSQL 更新多对多?

最佳答案

关系是一组事实。 Users , RolesUsersToRoles都是关系,将一个关系视为比另一个更“一流”是没有逻辑意义的。你正在做的事情很有意义,这就是为什么它似乎工作得很好。

ORM 世界对关系模型的破坏甚至比 SQL 还要糟糕。特别是,它制度化了关系数据库存储对象集合的谬误。他们没有;它们存储一组事实。其中许多事实都与实体有关,这就是谬论如此诱人的原因。但是很多事实是关于许多其他类型的概念,例如成员资格、事件、状态、意见、交易、变化、比较、历史等等。

还要考虑:

  • 在某些时候,您可能希望指出用户何时采用了某个角色,然后可能是该角色是待批准还是暂时撤销。我发现我想在数据模型中表达的几乎所有“关系”最终都会携带超过构成多对多关系的两个外键的有效载荷。如果您的 OR 映射已设置为隐藏多对多(正如他们倾向于做的那样),您会发现转换到实体在代码损坏方面非常痛苦。
  • 通常关系比二元关系更复杂。 “P教授在C类使用教科书T。”可能是一种不可约的三元关系,不容易隐藏在教授对象的某些集合属性后面。
  • 我刚刚注意到这个问题以 SO question 的形式出现。几分钟前。从问题看来,JPA 2.0 必须明确添加对三元关系的支持(它是否处理四元关系等?)。
  • 关于.net - 使用 Linq To SQL 更新多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2613256/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com