【问题标题】:Best way to update a single property?更新单个属性的最佳方法?
【发布时间】:2014-04-17 21:00:52
【问题描述】:

我的应用程序中有以下代码

using (ApplicationDbContext ctx = new ApplicationDbContext())
{
     Instance i = ctx.Instance.FirstOrDefault(s => s.Id == id);
     i.Views++;
     ctx.SaveChanges();
}

有没有更有效的方法来实现这一点?或者 EF 是否足够聪明,能够意识到发生了什么并生成一个简单的更新语句,而不是运行一个选择然后更新?

任何帮助或指导如何工作都会很好。

【问题讨论】:

标签: c# entity-framework ef-code-first


【解决方案1】:

不,EF 不够聪明,无法一次性完成这两件事。

我用一个简单的模型进行了尝试,并观察了分析器中发生的情况。 在像您这样的示例中,EF 将首先使用SELECT 获取记录,然后使用所需的UPDATE 运行exec sp_executesql

很遗憾,我很确定您无法让 EF 以更智能的方式执行此操作。

即使您将代码缩短为:

Instance i = ctx.Instance.First(s => s.Id == id).Views++;
ctx.SaveChanges();

它仍然会在单独的 SELECTUPDATE 中执行此操作。

我认为这只是您不直接使用SQL 访问数据库所付出的代价。

正如 Sriram Sakthivel 和other questions 所指出的,您可以使用EntityFramework.Extended(也可通过nuget 获得)一次性完成,然后您不再需要SaveChanges()

只需将包添加到项目中并

using EntityFramework.Extensions;

到你想使用它的文件,然后你可以像这样一次运行更新:

ctx.Instance.Update(i => i.Id == id, i => new Instance() { Views= i.Views + 1 });

在发送到您的 DBMS 的原始 SQL 中,它看起来像这样:

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])

不完全漂亮,但仍然比两个单独的语句更好,嘿:)?

【讨论】:

  • 啊,真是太可惜了.. 这是一个很常见的场景,你会认为这样做会更聪明或者是单独的方法!
  • @Steoates,@Thewads 我现在还在我的回答中包含了有关EntityFramework.Extended 的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2020-11-26
  • 2019-06-11
  • 2011-06-30
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多