我正在研究应该具有非常好的性能的post方法。
我在请求正文中有一个值,该值将在数据库中查找与该值连接的行,然后将其返回并添加为外键。
现在怎么样:
所以现在有3个对数据库的调用
我想知道是否有某种GetOrAdd
方法会将表连接到我的数据(如果存在),如果不存在,则将其添加到数据库中,因此在大多数情况下只能进行一次调用而不是总是调用3次
答案 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方法,它将被更新,否则将被创建为新记录。