2010-08-31 161 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