实体框架核心GetOrAdd方法

时间:2018-11-28 13:38:15

标签: asp.net-core entity-framework-core

我正在研究应该具有非常好的性能的post方法。

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

现在怎么样:

  1. 查看数据库并检查数据是否已经存在
  2. 如果没有,则将其添加到数据库中
  3. 查看数据库中已添加或已经存在的数据,并将其加入实体

所以现在有3个对数据库的调用

我想知道是否有某种GetOrAdd方法会将表连接到我的数据(如果存在),如果不存在,则将其添加到数据库中,因此在大多数情况下只能进行一次调用而不是总是调用3次

2 个答案:

答案 0 :(得分:2)

请阅读以下doc

这是“插入或更新”模式:

override fun getString(key: String?, defValue: String?): String? {
    if(key == null){
        return defValue
    }

    val userId = UserUtils.getCurrentUser()?.uid.orEmpty()
    database.getReference("users/$userId/preferences/$key").addListenerForSingleValueEvent(object: ValueEventListener{
        override fun onDataChange(p0: DataSnapshot) {
           //the return value is here, but i am not able to return it cause it's a listener

        }

        override fun onCancelled(p0: DatabaseError) {}
    })

    return "wot";
}

值得注意的是,一旦您击中public void InsertOrUpdate(Blog blog) { using (var context = new BloggingContext()) { context.Entry(blog).State = blog.BlogId == 0 ? EntityState.Added : EntityState.Modified; context.SaveChanges(); } } ,您就可以期望内存中的对象(在这种情况下为SaveChanges())与存储在数据库中的对象相同,而不必创建第三次调用以再次检索它。 EF Core将使用实际的持久ID更新blog

答案 1 :(得分:0)

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 状态下对其进行跟踪。

此评论来自Entity Framework Core的Update方法。如果数据库中存在实体,则只需调用Update方法,它将被更新,否则将被创建为新记录。