更新单个属性的最佳方式
本文关键字:最佳 方式 属性 单个 更新 | 更新日期: 2023-09-27 17:49:49
我的应用程序中有以下代码
using (ApplicationDbContext ctx = new ApplicationDbContext())
{
Instance i = ctx.Instance.FirstOrDefault(s => s.Id == id);
i.Views++;
ctx.SaveChanges();
}
是否有更有效的方法来实现这一点?或者EF是否足够聪明,能够意识到发生了什么,并生成一个简单的更新语句,而不是运行一个选择然后更新?
任何帮助将是伟大的或指导,这应该如何工作
不,EF不够聪明,不能一次完成两件事。
我用一个简单的模型进行了尝试,并观察了在分析器中发生的情况。在类似您的示例中,EF将首先使用SELECT
获取记录,然后使用所需的UPDATE
运行exec sp_executesql
。
不幸的是,我很确定你不能让EF以一种更智能的方式来做这件事。
即使你把代码缩短为:
Instance i = ctx.Instance.First(s => s.Id == id).Views++;
ctx.SaveChanges();
它仍然会在单独的SELECT
和UPDATE
中做。
我认为这就是你不直接使用SQL
访问数据库的代价。
正如Sriram Sakthivel所指出的,在其他问题中,您可以使用EntityFramework。扩展(也可以通过nuget)在一次运行中完成,您不再需要SaveChanges()
。
只需将包添加到项目和
using EntityFramework.Extensions;
到你想要使用它的文件,然后你可以在一次运行中完成你的更新,像这样:
ctx.Instance.Update(i => i.Id == id, i => new Instance() { Views= i.Views + 1 });
在原始SQL中,然后发送到您的DBMS,它看起来像这样:
UPDATE [dbo].[Instance] SET
[Views] = [Views] + 1
FROM [dbo].[Instance] AS j0 INNER JOIN (
SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[Instance] AS [Extent1]
WHERE 1 = [Extent1].[Id]
) AS j1 ON (j0.[Id] = j1.[Id])
不完全漂亮,但仍然比两个单独的语句好,是不是?