我的示例数据库中有三个表:
UserRoles是一个用于模拟多对多关系的查找表。向此表添加记录允许用户关联用户和角色中的记录。我的问题是,在实体框架中,它正确地将其解释为多对多的关系并抽象出查找表。生成的实体和关系如下所示:
http://www.codetunnel.com/content/images/manytomany.jpg
这在大多数时候都很有效,但是当我想要从该查找表中添加/删除条目时,我不知道该怎么做。我可以删除角色或用户,但实际上删除了对象,而不仅仅是它们之间的关联。
我知道有一个选项可以将一个虚拟列添加到UserRoles查找表中。这将迫使Entity Framework将查找表转换为一个完整的实体,允许我添加和删除它们作为单独的对象。但我不需要虚拟列,这似乎是一个黑客。我正在寻找更好的建议。
感谢任何帮助。
答案 0 :(得分:7)
看起来应该是这样的:
user.Roles.Remove(existingRoleEntity);
user.Roles.Add(existingRoleEntity);
答案 1 :(得分:3)
您可以使用实体上的导航属性:
(假设你是一个用户对象):
using (var db = new UserEntities())
{
Role roleToRemove = db.Roles.Single(SelectRoleHere);
User user = db.Users.Single(SelectUserHere);
user.Roles.Remove(roleToRemove);
db.SaveChanges();
}
编辑 - 根据Slauma的评论添加了SaveChanges。
答案 2 :(得分:1)
之前我通过简单地将私钥标识符自动增量列添加到查找表来解决了这个问题,因为Entity Framework
将始终隐藏仅包含2个带有外键到结束表的列的查找表。有时您需要通过Entity Framework
直接自己添加查找条目,这将有助于您实现这一目标。
我只是想提供一个关于我自己实现这个答案的更新。我在查找表中添加了一个标识列,并在两个外键列上创建了一个唯一键,以防止表中出现重复的关系条目。我的模型现在看起来像这样:
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);
您始终可以使用public partial class扩展User
以使用上述属性返回所有角色。点击链接,了解我在另一个问题上提供的public partial class
内容的详细信息。