我有以下表格/观点
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集合中的更改。
答案 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;
但我相信这只影响实体的标量属性,并没有解决向用户添加新角色的问题。