更新具有一对多关系的实体

时间:2011-10-21 02:50:07

标签: c# .net entity-framework linq-to-entities

我遇到了一对多关系的问题,我正在尝试更新其中一个表和链接表中的数据。

  • 我有两个表(用户,角色)和一个链接表(UserRoles)。
  • 用户有很多角色。
  • 角色是预定义的,只有3行,如下所示。

我想用角色更新用户。我无法使用以下代码。 请分享您的意见。

Original
User : John
Roles : Admin, User

Update to
User : John
Roles : User

这是表结构

User
UserID : Pk
Name

Roles //Data is not added in this table, Data already exists in this table
RoleID : Pk
Name

RoleID   Name
1        Admin
2        User
3        None

UserRoles
UserID  : PK
RoleID : Pk

相应的实体

User
UserId
Name
EntityCollection<Role> Roles

Role
RoleId
Name
EntityCollection<User> Users

我尝试使用以下代码

public void update(int userId, string newusername, list<int> roleList)
{
    using (DBEntites context = new DBEntites())
    {
        User objUserInDb = new User();
        objUserInDb.UserID = userId;
        Context.Users.Attach(objUserInDb);
        objUserInDb.Name = newusername;
        objUserInDb.Roles.Clear(); 

        // TRIED TO USE The remove method objUserInDb.Roles.Remove(entity), 
        // is returning false

        foreach (long pkIDToAdd in roleList)
        {
            Role objRoleInDb = new Role();
            objRoleInDb.RoleId = pkIDToAdd;

            // GIVES EXCEPTION 
            //An object with the same key already exists in the ObjectStateManager. 
            //The ObjectStateManager cannot track multiple objects with the same    
            //
            context.Roles.Attach(objRoleInDb);
            objUserInDb.Roles.Add(objRoleInDb);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

异常是因为某些角色已经加载到上下文中。你可以这样做,

  foreach (long pkIDToAdd in roleList)
        {
            var role=  context.RiskTypes.FirstOrDefault(r=>r.id==pkIDToAdd );
            objUserInDb.Roles.Add(role);
        }