Asp.net core 实体框架核心GetOrAdd方法

Asp.net core 实体框架核心GetOrAdd方法,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我正在研究一种post方法,它应该有很好的性能 我在请求主体中有一个值,它将在数据库中查找与该值连接的行,并返回该值,然后将其作为外键添加 现在情况如何: 查看数据库并检查数据是否已经存在 如果没有,请将其添加到数据库中 查看数据库中已添加或已存在的数据,并将其连接到实体 现在有3个对数据库的调用 我想知道是否有某种GetOrAdd方法可以将表连接到我的数据(如果它存在),如果它不存在,则将其添加到数据库中,这样在大多数情况下,它将只对数据库进行一次调用,而不是始终进行三次调用。请阅读以下内容

我正在研究一种post方法,它应该有很好的性能

我在请求主体中有一个值,它将在数据库中查找与该值连接的行,并返回该值,然后将其作为外键添加

现在情况如何:

  • 查看数据库并检查数据是否已经存在
  • 如果没有,请将其添加到数据库中
  • 查看数据库中已添加或已存在的数据,并将其连接到实体
  • 现在有3个对数据库的调用


    我想知道是否有某种
    GetOrAdd
    方法可以将表连接到我的数据(如果它存在),如果它不存在,则将其添加到数据库中,这样在大多数情况下,它将只对数据库进行一次调用,而不是始终进行三次调用。请阅读以下内容

    以下是“插入或更新”模式:

    需要注意的是,一旦点击
    SaveChanges()
    ,您可以期望内存中的对象(
    blog
    ,在本例中)是存储在数据库中的同一个对象,并且不必再次进行第三次调用来检索它。EF Core将使用实际的持久化Id更新
    主键

    using (var context = new BloggingContext())
    {
       var blog = new Blog {Id = 1, Url = "blablabla" };
       context.Blogs.Update(blog);
       await context.SaveChangesAsync();
    }
    
    如果可访问实体的主键值已设置,则将在Microsoft.EntityFrameworkCore.EntityState.Modified状态中跟踪该实体。如果未设置主键值,则将在Microsoft.EntityFrameworkCore.EntityState.Add状态中跟踪它


    此注释来自实体框架核心的更新方法。若数据库中存在实体,那个么只需要调用Update方法,它将被更新,否则将被创建为新记录

    EF已经在一次往返中完成了2和3。我认为主要是因为数据库供应商之间缺少统一的语法。但是,EF core的更新方法假设记录在具有非默认键值时存在。
    using (var context = new BloggingContext())
    {
       var blog = new Blog {Id = 1, Url = "blablabla" };
       context.Blogs.Update(blog);
       await context.SaveChangesAsync();
    }