【问题标题】:Update Entity with One to Many relationship使用一对多关系更新实体
【发布时间】:2011-10-21 02:50:07
【问题描述】:

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

  • 我有两个表(用户、角色)和一个链接表(用户角色)。
  • 一个用户有很多角色。
  • 角色是预定义的,只有 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);
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,贾扬塔。实际上,我试图通过使用 FirstOrDefault 方法并因此使用 Attach 方法来避免数据库调用。我已经尝试使用带有新创建的 RiskType 的 TryGetObjectByKey 方法,使用 Role objRole = new Role(); objRole.RoleId = 1;但我可以看到 objRole 的 Entity 键为 null 并且 EntityState 已分离。当我尝试使用 Attach 方法时,它给出了带有键的对象的异常已经存在。我想避免使用硬编码字符串来创建新的实体键并对其进行检查。希望我清楚
    • 是的,我知道了。您可以查看context.Entry(role).State,如果是Detached,您可以重新附加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2019-01-23
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多