【发布时间】:2016-03-04 19:03:23
【问题描述】:
我有一个字段,用于计算用户的订阅总数。现在我像这样更新这个字段:
using (var context = new AppDbContext())
{
var foundEntry = context.Users.Find(id);
if (foundEntry != null)
{
foundEntry.TotalSubscriptions = foundEntry.TotalSubscriptions + 1;
context.Entry(foundEntry).CurrentValues.SetValues(foundEntry);
var result = context.SaveChanges();
}
}
但是这样我必须对数据库进行 2 次查询。一个用于获取当前总计数,另一个用于更新值。
有没有办法通过实体框架只对数据库进行一次查询来做到这一点?
我想尝试这样的事情:
var user = new User() { Id = userId, TotalSubscriptions = currentS + 1 };
db.Users.Attach(user);
db.Entry(user).Property(x => x.TotalSubscriptions).IsModified = true;
但我面临的问题是我必须先获取当前计数,但不知道如何在单个查询中执行。我认为使用原始 SQL 语句/查询可以对此进行 1 次查询。
我正在尝试归档类似这样的内容:https://stackoverflow.com/a/2762856/1286942,但使用实体框架。
更新
我也试过这样的:
var user = new User() { Id = userId };
db.Users.Attach(user);
user.TotalSubscriptions = context.Entry(user)
.Property(u => u.TotalSubscriptions).OriginalValue + 1;
db.Entry(user).Property(x => x.TotalSubscriptions).IsModified = true;
但问题是.OriginalValue 和.OriginalValue 总是返回0。所以TotalSubscriptions 字段总是更新为-1 或1。
更新 #2
现在我只看到这个选项:
var numberOfUpdatedRows = context.Database
.ExecuteSqlCommand("UPDATE dbo.Users
SET TotalSubscriptions = TotalSubscriptions + 1
WHERE id = " + id + "");
【问题讨论】:
-
无法直接使用 EF 执行此操作。您要么必须运行一些原始 SQL(即 UPDATE)或调用存储过程。
-
在最坏的情况下,我猜我仍然可以执行原始 SQL 语句。
-
@JoSmo,微软建议使用 Raw SQL 进行批量更新
标签: c# sql sql-server asp.net-mvc entity-framework