2014-04-01 49 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