批量更新数据库的最快方法?

时间:2012-09-25 21:19:46

标签: c# asp.net entity-framework

所以我在我的程序的某个部分一次更改了很多条目。 现在的代码对于每个代码都是这样的:

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多次访问数据库,不是吗?你会推荐什么?

2 个答案:

答案 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解决方案(肯定已在网络上的其他地方描述过)。

相关问题