所以我在我的程序的某个部分一次更改了很多条目。 现在的代码对于每个代码都是这样的:
foreach(newentry)
{
oldentry = context.Users.Find(entry.userid);
newentry.oldvalue = newvalue;
context.Entry(oldentry).CurrentValues.SetValues(newentry);
}
context.SaveChanges();
然而,这最终导致数据库查询300次以上并且正在扼杀我的表现。 我想到的唯一方法是预加载数据库,但我不认为这是最好的方法。
var userlist = context.Users.ToList();
foreach(newentry in userlist)
{
var original = entry;
entry.originalvalue = newvalue;
context.Entry(original).CurrentValues.SetValues(newentry);
}
context.SaveChanges();
我还在300多次访问数据库,不是吗?你会推荐什么?
答案 0 :(得分:3)
我会使用直接ADO来做到这一点。我将获取用户ID列表,然后使用表值参数进行批量更新。
以下是来自this MSDN文章的示例:
UPDATE dbo.Categories
SET Categories.CategoryName = ec.CategoryName
FROM dbo.Categories INNER JOIN @tvpEditedCategories AS ec
ON dbo.Categories.CategoryID = ec.CategoryID;
答案 1 :(得分:2)
第二种方式是加载所有用户,然后在调用SaveChanges时“批量更新”所有用户。它比第一个版本效率更高,因为它不会发送300个选择(只有一个更大的选择)。
对于没有手动SQL的原始EF,这是最好的。这种表现可能对你没问题。你可能应该测量它需要多长时间并决定它是否足够。
如果你认为它不够快,你需要求助于一个原始的SQL解决方案(肯定已在网络上的其他地方描述过)。