更新单个属性的最佳方式

本文关键字:最佳 方式 属性 单个 更新 | 更新日期: 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();

它仍然会在单独的SELECTUPDATE中做。

我认为这就是你不直接使用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])

不完全漂亮,但仍然比两个单独的语句好,是不是?