【问题标题】:Create a entity with existing entity that comes from db使用来自 db 的现有实体创建一个实体
【发布时间】:2020-01-07 10:23:07
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的实体框架。你面临什么错误?你也可以发布错误消息吗??
  • @ZulqarnainJalil 问题已根据您的评论更新。

标签: c# entity-framework-core


【解决方案1】:

您正在编辑一个不可能的现有用户角色...因为它也被其他用户使用。你只需要创建一个新的用户角色实例

user.Role = new Role(){OrganizationId = 5};
Context.SaveChanges();

【讨论】:

  • 但我正在尝试添加新角色而不是删除它保留在数据库中的现有角色,并且另一个实体之间的联系仍然健康。
  • 您是否要为单个用户添加多个角色?
  • 此代码不会删除现有角色。它将在数据库中创建一个新角色并将新创建的角色分配给用户。同样根据您的实体结构,您不能为用户分配多个角色
  • 但我不想再写所有属性,我只想更改几个属性然后创建,我已经知道这样创建实体了。
【解决方案2】:

在尝试了多种方式(例如更改状态或其他方式)后,我找到了一种最简单的方式。

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多