2014-04-09 23 views
0

我有一個用戶1 * UserGroupLinks * -1羣組表結構,創建了以下方法:實體框架保存多對多的變化

public static string SaveUser(User user, List<UserGroup> newUserGroups) 
{ 
    using (var dbContext = new DCSEntities()) 
    {  
     var existingUserGroups = user.UserGroups.ToList<UserGroup>(); 
     existingUserGroups.ForEach(d => user.UserGroups.Remove(d));     
     newUserGroups.ForEach(a => user.UserGroups.Add(a)); 
     dbContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 
     dbContext.SaveChanges(); 
     return user.UserCode; 
    } 
} 

我想刪除所有usergrouplinks該用戶,然後添加新的用戶組列表。當我運行這個方法時,我得到了UserGroups對象/ UsergroupLink表上的主鍵違例,表明我嘗試刪除現有的usergrouplinks失敗。我該如何解決這個錯誤?

所以我改變了原來的代碼來確認一個懷疑。

public static string SaveUser(User user, List<UserGroup> newUserGroups) 
{ 
    using (var dbContext = new DCSEntities()) 
    { 
     User dbUser = dbContext.Users.Where(u => u.UserCode == user.UserCode).Include(ug => ug.UserGroups).Include(s => s.Status).FirstOrDefault(); 
     var existingUserGroups = dbUser.UserGroups.ToList<UserGroup>(); 
     existingUserGroups.ForEach(d => dbUserUserGroups.Remove(d)); 
     newUserGroups.ForEach(a => dbContext.UserGroups.Attach(a)); 
     newUserGroups.ForEach(a => dbUser.UserGroups.Add(a)); 
     dbContext.ObjectStateManager.ChangeObjectState(dbUser, EntityState.Modified); 
     dbContext.SaveChanges(); 
     return dbUser.UserCode; 
    } 
} 

我可以證實的是,只爲用戶添加新組時,何時該代碼工作。只要您嘗試添加現有組,就會違反主鍵。這幾乎就好像該線

existingUserGroups.ForEach(d => dbUserUserGroups.Remove(d)); 

沒有生效。 我下面的解決方案並不高雅,因此我沒有將其標記爲答案。

+0

你能發佈你收到的錯誤嗎? – Dismissile

+0

{「違反PRIMARY KEY約束'PK_Groups'。無法在對象'dbo.UserGroups'中插入重複鍵,重複鍵值爲(QA)。\ r \ n語句已終止。」} – breakerdotnet

+0

'existingUserGroups'在'using'塊的第一行後面的項目? –

回答

0

使用2個不同的dbcontexts的想法實際工作,但是按照我上面的評論,我不認爲這是一個優雅的或正確的解決方案:

public static string SaveUser(User user, List<UserGroup> newUserGroups) 
{ 
    using (var dbContext = new DCSEntities()) 
    { 
     User dbUser = dbContext.Users.Where(u => u.UserCode == user.UserCode).Include(ug => ug.UserGroups).Include(s => s.Status).FirstOrDefault(); 
     var existingUserGroups = dbUser.UserGroups.ToList<UserGroup>(); 
     existingUserGroups.ForEach(d => dbContext.UserGroups.Detach(d)); 
     existingUserGroups.ForEach(d => dbUser.UserGroups.Remove(d)); 
     dbContext.ObjectStateManager.ChangeObjectState(dbUser, EntityState.Modified); 
     dbContext.SaveChanges(); 
    } 

    using (var dbContext = new DCSEntities()) 
    { 
     User dbUser = dbContext.Users.Where(u => u.UserCode == user.UserCode).Include(ug => ug.UserGroups).Include(s => s.Status).FirstOrDefault(); 
     newUserGroups.ForEach(a => dbContext.UserGroups.Attach(a)); 
     newUserGroups.ForEach(a => dbUser.UserGroups.Add(a)); 
     dbContext.ObjectStateManager.ChangeObjectState(dbUser, EntityState.Modified); 
     dbContext.SaveChanges(); 
     return dbUser.UserCode; 
    } 
} 

我甚至於複製去這個解決方案逐字,仍然得到了主鍵違規問題entity framework update many to many relationship: virtual or not

如果任何人都可以解釋爲什麼我需要在2種不同的情況下做到這一點,我將不勝感激。 Thanx