使用Stub更新实体框架会导致主键违规

时间:2014-04-01 12:45:57

标签: entity-framework primary-key

我有以下常用表格,我的实体模型中有多种关系设置关系:

Users - UserCodePK, UserName
UserGroups - UserCodeFK,GroupCodeFK
Groups - GroupCodePK,GroupDescription
尝试添加用户时

我的代码:

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;
    }
}

1 个答案:

答案 0 :(得分:1)

使用存根是个好主意。您只需要确保EF不会将它们视为新对象,您可以通过将存根附加到上下文来完成。现在EF不会给它状态Added

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

...

u.Groups.Add(group);

如果GroupCode是主键,EF将知道如何关联对象。