在实体框架中添加/删除许多到许多关联

本文关键字:许多 删除 关联 添加 实体 框架 | 更新日期: 2023-09-27 18:02:27

我的示例数据库中有三个表:

用户
  • ID
  • 用户名

角色
  • ID
  • <
  • 名称/gh>

UserRoles

  • UserID
  • RoleID

UserRoles是一个模拟多对多关系的查找表。向该表添加记录允许将Users和Roles中的记录关联起来。我的问题是,在实体框架中,它正确地将此解释为多对多关系,并抽象出查找表。

这在大多数情况下工作得很好,但是当我想从查找表中添加/删除条目时,我不确定该怎么做。我可以删除角色或用户,但这实际上删除了对象,而不仅仅是它们之间的关联。

我知道有一个选项可以向UserRoles查找表添加一个虚拟列。这将迫使实体框架将查找表转换为一个完整的实体,允许我将它们作为单独的对象添加和删除。但我不需要一个假的专栏,这似乎是一个hack。我在寻找更好的建议。

在实体框架中添加/删除许多到许多关联

看起来应该是这样的:

删除关系

user.Roles.Remove(existingRoleEntity);

添加关系

user.Roles.Add(existingRoleEntity);

你可以在实体上使用导航属性:

(假设u是User对象):

using (var db = new UserEntities())
{
    Role roleToRemove = db.Roles.Single(SelectRoleHere);
    User user = db.Users.Single(SelectUserHere);
    user.Roles.Remove(roleToRemove);
    db.SaveChanges();
}

EDIT -根据Slauma的评论添加SaveChanges

我以前通过简单地向查找表添加一个私钥标识符自动增量列来解决这个问题,因为Entity Framework将始终隐藏只包含2列的查找表,并将外键指向端表。有时您需要通过Entity Framework直接添加查找条目,这将帮助您实现这一目标。

Update From Question Author

我只是想提供我自己实现这个答案的更新。我在查找表中添加了一个标识列,并在两个外键列上创建了一个唯一键,以防止表中出现重复的关系项。我的模型现在看起来像这样:

http://www.codetunnel.com/content/images/ManyToManyDynamic.jpg

唯一糟糕的事情是获得所有相关角色的集合,我必须这样做:

List<Role> roles = new List<Role>();
foreach (UserRole userRole in myUser.UserRoles)
    roles.Add(userRole.Role);

这是一点更多的工作,但除非有一个等效的user.Roles.Remove(role)(类似user.Roles.Associate(existingRoleEntity)),那么这是我唯一的选择。

更新:

List<Role> roles = new List<Role>();
foreach (UserRole userRole in myUser.UserRoles)
    roles.Add(userRole.Role);

可以通过:

IEnumerable<int> roleIDs = myUser.UserRoles.Select(r => r.RoleID);
IEnumerable<Role> roles = Entityies.Roles.Where(r => roleIDs.Contains(r.roleID);

你总是可以使用一个公共的分部类来扩展User,使其拥有一个属性来返回所有使用上面的角色。点击链接查看public partial class的细节,我给了另一个问题