我有以下表格/ View
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 是一个 View ,UserRoles 是一个映射表。我能够检索用户实体以及映射的角色。但是在保存时它不会抛出任何异常,也不会保存。我尝试使用探查器检查数据库,但它甚至没有命中数据库。
由于用户是一个 View ,我不想保存用户实体,而只想保存在角色集合中所做的更改。
最佳答案
这无法挽救任何东西。 Attach
将整个对象图放入上下文中,但处于状态Unchanged
。如果上下文中的所有对象均未更改,SaveChanges
将不会向数据库发出任何命令(因为对于 EF 而言,没有任何更改)。
如果您想要进行 EF 识别的更改,您必须首先附加代表数据库中状态的对象,然后进行更改,例如:
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;
但我相信这只会影响实体的标量属性,并不能解决向用户添加新角色的问题。
关于entity-framework - 无法保存多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386014/