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