使用来自db的现有实体创建一个实体

时间:2019-09-04 13:47:03

标签: c# entity-framework-core

我正在尝试使用来自查询的实体创建与现有用户相关的新角色。我从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”,然后将依赖项与新委托人相关联。

2 个答案:

答案 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;