2010-08-31 120 views
4

我有3个表 -实体框架4多对多更新

User (Id, Name) 
Roles (Id, Name) 
UserRoles (UserId, RoleId) 

我认为他们是自我解释。如何更新UserRoles中的条目(UserId和RoleId)?

context.User.Roles给了我角色列表,但是如何更新它们?

谢谢。

+0

这里有类似的问题:http://stackoverflow.com/questions/1732609/how-do-i-create-and-update-a-many-to-many-relationship-with-ef – Yakimych 2010-08-31 19:31:05

+0

链接表示“加载所需的对象,设置更改的属性并在上下文中调用SaveChanges。” context.User.Roles给了我角色列表。我可以做一个for-each并更新Id,但是如何更新该表中对应的UserId foreach RoleId? – tempid 2010-08-31 19:48:19

+0

有人吗?这真让我抓狂。 – tempid 2010-08-31 21:18:48

回答

6

从您的评论:

context.User.Roles给我的角色列表 。我可以做一个for-each和 更新Id,但我怎么更新 对应的UserId foreach RoleId 那个表?

首先,你不应该更新ID的。
其次,由于您使用的是EF,您应该尝试用对象(或实体)的方式来思考,而不是“DB-many-to-many-mapping-tables”。每个User实体都有一个Roles的集合。如果您从User.Roles集合中删除Role并呼叫context.SaveChanges(),则相应的条目将从UserRoles表中删除。同样,将Role对象添加到User.Roles集合并保存更改时,将在UserRoles表中创建一个新条目。
下面的示例可能是为了清楚有用:

var user = context.Users.Include("Roles").Where(u => u.Name == "User1").FirstOrDefault(); 
user.Roles.Remove(user.Roles.Where(r => r.Name == "Admin").FirstOrDefault()); 
context.SaveChanges(); 

(为简单起见省略空引用检查)。

+0

谢谢你的回答。我知道我必须从连接表中完全删除记录并添加一个新记录,而不是尝试更新现有记录。另外,我需要将UserId和RoleId作为连接表中的组合键才能工作。 – tempid 2010-09-02 13:16:07