对于EF Core和.NET 8,假设我使用数据库搭建工具生成如下所示的实体类:

public partial class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Role> Roles { get; set; } = new List<Role>();
}

public partial class Role
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> People { get; set; } = new List<Person>();
}

假设我已经编写了一些代码,如下所示:

public async Task<bool> Create(Person entity)
{
    var roles = entity.Roles.ToList();
    Context.People.Add(entity);
    int rowsCreated = await Context.SaveChangesAsync();
    bool result = rowsCreated > 0;
    return result;
}

假设我已经用反序列化以下JSON(省略有关清理输入的详细信息)获得的数据补充了传递给上述函数的Person个实体:

{
    "Id": 101,
    "Name": "Sally",
    "Roles": [
        { "Id": 201 },
        { "Id": 202 }
    ]
}

我遇到的问题是EF Core试图向Role个表中添加新行,而不是引用现有角色.我知道在EF 6中,我必须将Role个实体类"附加"到上下文中,但我不清楚在EF Core中如何做到这一点.

我想有能力做到这一点,而不必查询Role表的过程中,upserting一个人.

推荐答案

我知道在EF6中,我必须将角色实体类"附加"到上下文,但我不清楚在EFCore中如何做到这一点.

EF Core在这方面没有太大变化.如果您在创建时获取了角色,则只需分配它们即可.大致是这样的:

entity.Roles = roles
   .Where(r => entity.Roles.Any(er => er.Id == r.Id))
   .ToList();
Context.People.Add(entity);

或者,您可以只附加它们,而不提取它们.例如,使用DbSet<TEntity>.AttachRange:

Context.Roles.AttachRange(entity.Roles);
Context.People.Add(entity);

这应该能起到作用.

还要注意的是,你可以直接expose the join entity和操纵它,这有时可能会更舒服.

Csharp相关问答推荐

我可以将Expressc操作设置为在另一个Expressc操作完成后自动发生吗?

使用ElasticsearchClient设置忽略属性.默认MappingFor<>

错误NU 1301:无法加载源的服务索引

如何将字节数组转换为字符串并返回?

Serilog SQL服务器接收器使用UTC作为时间戳

在C#中使用in修饰符

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

NumPy s fftn in C#with pythonnet'

此反射有什么问题.是否发送值转换委托?

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

正确处理嵌套的本机集合

如何向事件添加成员

如何在用户在线时限制令牌生成?

为什么在使用JsonDerivedType序列化泛型时缺少$type?

在C#中通过Matheval使用自定义公式

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值