无法保存多对多关系

时间:2011-06-17 12:52:56

标签: entity-framework save

我有以下表格/观点

Users (View)
-> UserId
-> Name

Roles (Table)
-> RoleId
-> Name

UserRoles (Table)
-> UserId
-> RoleId

和班级

public class Role{
     public int RoleId{get;set}
     public string Name{get;set}
}

public class User{
     public int UserId{get;set}
     public string Name{get;set}
     public ICollection<Role> Roles{get;set}
}

和保存方法

using (var helper = new DbContext())
{
     helper.Users.Attach(user);
     helper.SaveChanges();
}

如上所示,Users是一个视图,UserRoles是一个映射表。我能够检索用户实体以及映射的角色。但是,保存它不会抛出任何异常,也不会节省。我尝试使用分析器检查数据库,它甚至没有命中数据库。

由于Users是一个视图,我不想保存用户实体,只想保存Roles集合中的更改。

1 个答案:

答案 0 :(得分:3)

这无法保存任何东西。 Attach将整个对象图放入上下文中,但状态为Unchanged。如果上下文中的所有对象都未更改SaveChanges将不向DB发出任何命令(因为对于EF没有任何更改)。

如果您想要进行EF识别的更改,您必须首先附加代表Db中状态的对象,然后进行更改,例如:

using (var helper = new DbContext())
{
    helper.Users.Attach(user);
    helper.Roles.Attach(myNewRole);
    user.Name = myNewName;
    user.Roles.Add(myNewRole);
    // etc.
    helper.SaveChanges();
}

或者,您可以将用户标记为已修改:

helper.Entry(user).State = EntityState.Modified;

但我相信这只影响实体的标量属性,并没有解决向用户添加新角色的问题。