我正在尝试使用来自查询的实体创建与现有用户相关的新角色。我从db获得一个实体;
var user = GetAll()
.Include(s => s.User)
.ThenInclude(a => a.Role)
.FirstOrDefaultAsync(s => s.Id == userId);//at this point role state is unchanged when i try to update its fields context thinks it is modified.
尝试执行此操作时出现错误;
var roleEntry = Context.Entry<Role>(user.Role);
roleEntry.State = EntityState.Added;
user.RoleSetId = null;
user.Role.Id = 0;
user.Role.OrganizationId = 5;//other properties of role remains same as db with other navigation properties
Context.SaveChanges();
实体框架核心2.2.4
错误;
实体类型“角色”上的属性“角色ID”是键的一部分,因此无法进行修改或将其标记为已修改。要使用标识的外键更改现有实体的委托人,请先删除依赖项,然后调用“ SaveChanges”,然后将依赖项与新委托人相关联。
答案 0 :(得分:1)
您正在编辑一个现有的用户角色,这是不可能的,因为其他用户也在使用该角色。您只需要创建一个新的用户角色实例
user.Role = new Role(){OrganizationId = 5};
Context.SaveChanges();
答案 1 :(得分:0)
尝试了多种方法(例如更改状态或其他事情)后,我发现了一种最简单的方法。
var role = GetAllRoles()
.AsNoTracking() //Important thing is here
.Include(s => s.OrganizationUnits)
.FirstOrDefaultAsync(s => s.Id == roleId);
这些代码创建相同的实体,并关联角色和组织单位之间的关系,然后我们可以将该角色ID赋予用户或其他事物。这些类只是示例;
role.Id=0;
role.Name="Mahmut";
foreach (var organizationUnit in role.OrganizationUnits)
{
organizationUnit .RoleId = 0;
organizationUnit .Role= null;
}
context.Add(role);
user.RoleId=role.Id;