【发布时间】:2010-04-10 21:19:46
【问题描述】:
例如,如果我在用户和角色表之间有一个名为“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 更新多对多?
【问题讨论】:
-
从技术上讲,这实际上并不是多对多的 ORM 等价物,因为您要手动清除连接表。 ORM 中对 m2m 的“适当”支持会将 User 对象建模为具有名为“Roles”的属性(或集合),因此,ORM 将负责在后台编辑连接表。
-
至少这是我的解释.. HIH
-
@RobS:同意。这也是我的解释:如果您只关心一个特定用户,您可以查看“用户”对象“角色”集合。如果您关心一个特定角色,请分别查看“角色”对象“用户”集合。这就是 ORM 的想法,隐藏数据库的东西,并像使用对象一样使用它。
标签: .net linq-to-sql many-to-many