2011-04-11 43 views
1

我試圖添加一個新的記錄,首先使用entityframework代碼的鏈接表。我所擁有的是UserRole上的多對多。我的情況是,當我改變了用戶的角​​色,我刪除所有以前的角色,並添加新的角色如下:多對多的實體框架不斷增加額外的記錄

//Delete all associated roles for user 
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var usersRoles = roleUser.Roles; 

usersRoles.ForEach(role => roleUser.Roles.Remove(role)); 

//add the new roles 
roleUser.Roles.AddRange(detachedUser.Roles); 

db.SaveChanges(); 

所以它完全刪除它們。但是,添加新角色時,不僅會將其添加到鏈接表中,還會將其添加到Role表中。沒有RoleName就會添加一個全新的角色。 user.Roles將包含與下面的數據項:

RoleId;//1 <-- this Id exists in the database already but yet still it creates one instead of a linktable record. 
RoleName;//null 

如何防止EF從添加了一個全新的紀錄,只是添加一條記錄到鏈接表?

更新:我落得這樣做:

var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var roles = db.Roles; 

foreach (var role in roles) 
{ 
    if (user.Roles.Any(r => r.RoleId == role.RoleId)) 
    { 
      roleUser.Roles.Add(role); 
    } 
    else 
    { 
     roleUser.Roles.Remove(role); 
    } 
} 
db.SaveChanges(); 
+0

顯然它解決了,但不能理解什麼解決了它。你能否再次發佈阻止創建新角色的部分答案。 – Mounhim 2012-02-14 19:26:07

回答

2

嘗試加入新的角色給用戶之前保存

//Delete all associated roles for user 
var roleUser = db.Users.Include(r => r.Roles).FirstOrDefault(u => u.UserId == user.UserId); 
var usersRoles = roleUser.Roles; 

usersRoles.ForEach(role => roleUser.Roles.Remove(role)); 
db.SaveChanges(); 

roleUser.Roles.AddRange(user.Roles); //add the new roles 
db.SaveChanges(); 

編輯:

看一看這樣的:

roleUser.Roles.AddRange(user.Roles); //add the new roles 

user.Roles從哪裏來?

+0

添加第二個SaveChanges後,我仍然遇到同樣的問題。 – 2011-04-11 15:48:21

+0

我認爲它是我添加新角色的方式。我可能必須從數據庫中獲取所有這些數據,並在出現類似問題時將它們添加到 – 2011-04-11 15:56:04

+0

,您可能還需要查看綁定配置。過去我有過這樣的問題。 – 2011-04-11 16:59:31

0

對於添加的每個卷,您都可以嘗試檢查或設置實體狀態。例如,在這裏我設置爲不變。這樣它不會嘗試插入或更新它。

myContext.Entry(roll).State = EntityState.Unchanged 

此處瞭解詳情: http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

+0

是真的,但是如果他在嘗試添加新角色之前保存了,那麼實體的狀態不會改變(保存之後) – 2011-04-11 17:42:27

1

我認爲你有問題,你需要將它們添加到用戶之前,附上您的角色。

你也不需要全部刪除它們,只需刪除那些刪除,然後只添加新的。

+0

我同意@moi_meme需要刪除那些需要刪除的。另一方面,我認爲這不是一個觸及附屬/分離國家的問題。因爲這些物體從不分離。 – 2011-04-11 18:11:03

+0

@Alexandre Brisebois - 我寫道,因爲他的變量被稱爲DetachedUser – 2011-04-11 18:14:48

+0

我的壞我沒有注意到那部分 – 2011-04-11 18:16:47