2014-04-01 48 views
1

我有關係設置了許多時尚在我的實體模型下列常見的表在許多:實體框架更新與存根導致主鍵衝突

​​

我的代碼試圖添加用戶時:

public static string CreateUser(User user) 
{ 
    using (var dbContext = new DCSEntities()) 
    { 
     User u = new User 
       { 
        UserCodePK = "NewUser", 
        txtUserName = "New User Name 
       }; 

     u.Groups.Add(new UserGroup {GroupCode = "ADMIN"}); 
     u.Groups.Add(new UserGroup {GroupCode = "SUPER"}); 
     dbContext.Users.AddObject(user); 
     dbContext.SaveChanges(); 
     } 
} 

是我得到的錯誤是:

"Violation of PRIMARY KEY constraint 'PK_Groups'. Cannot insert duplicate key in object 'dbo.Groups'. The duplicate key value is (ADMIN)" 

基本上說,我正在嘗試添加已在該表中存在的組「ADMIN」。我認爲通過使用上面的存根,我不需要去數據庫來獲取「ADMIN」組並將其添加到User對象。 有關如何擺脫錯誤的任何建議?

編輯:基於下面的建議(?我希望這是在正確的地方),我已完成的代碼

UI方法

protected void CreateUser() 
{ 
    User user = new User(); 
    user.UserCodePK = txtUserCode.Text; 
    user.UserName = txtUserName.Text;     
    List<UserGroup> userGroups = new List<UserGroup>(); 
    for (int i = 0; i < chkListGroups.Items.Count; i++) 
    { 
     if (chkListGroups.Items[i].Selected == true) 
     { 
      userGroups.Add(new UserGroup { GroupCodePK = chkListGroups.Items[i].Value }); 
     } 
    } 

    string userCode = BLL.UserFunctions.CreateUser(user, userGroups); 
} 

BLL方法

public static string CreateUser(User user, List<UserGroup> userGroups) 
{ 
    return UserDAL.CreateUser(user,userGroups); 
} 

DAL方法

public static string CreateUser(User user,List<UserGroup> userGroups) 
{ 
    using (var dbContext = new DCSEntities()) 
    { 
     foreach (UserGroup g in userGroups) 
     { 
      var ug = new UserGroup { GroupCode = g.GroupCode }; 
      dbContext.UserGroups.Attach(ug); 
      user.UserGroups.Add(ug); 
     } 
     dbContext.Users.AddObject(user); 
     dbContext.SaveChanges(); 
     return user.UserCode; 
    } 
} 
+0

'UserGroup.GroupCode'是主鍵嗎? –

+0

是的,這是主鍵 – breakerdotnet

回答

1

與存根一起工作是一個好主意。您只需確保EF不會將它們視爲新對象,您可以通過將該存根連接到上下文來執行此操作。現在EF不會給它的狀態Added

var adminGroup = new UserGroup {GroupCode = "ADMIN"}; 
db.Groups.Attach(adminGroup); 

... 

u.Groups.Add(group); 

如果GroupCode是主鍵,EF將知道如何關聯對象。

+0

非常感謝。有效。 我只是好奇,如果我已經在各個層級以正確的方式實現它。 – breakerdotnet