2

所以我在程序的某个部分一次更改了很多条目。现在每个代码看起来像这样:

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

4

2 回答 2

3

我会使用直接 ADO 来做到这一点。我将获取用户 ID 列表,然后使用表值参数进行批量更新。

这是此MSDN 文章中的示例:

UPDATE dbo.Categories
SET Categories.CategoryName = ec.CategoryName
FROM dbo.Categories INNER JOIN @tvpEditedCategories AS ec
ON dbo.Categories.CategoryID = ec.CategoryID;
于 2012-09-25T21:23:31.300 回答
2

第二种方式将加载所有用户,然后在您调用 SaveChanges 时“批量更新”所有用户。它比第一个版本更有效,因为它不发送 300 个选择(只是一个更大的选择)。

这是您可以在没有手动 SQL 的情况下使用原始 EF 做的最好的事情。这对你来说可能没问题。您可能应该测量需要多长时间并确定它是否足够。

如果您认为它不够快,则需要求助于原始 SQL 解决方案(肯定已经在网络上的其他地方进行了描述)。

于 2012-09-25T21:23:33.860 回答