更新单个房产的最佳方式?

时间:2014-03-13 08:48:32

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

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

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

有更有效的方法来实现这一目标吗?或者EF足够聪明,能够实现最新情况并生成简单的更新语句,而不是运行选择然后更新吗?

任何帮助都会很好或者指导它应该如何运作。

1 个答案:

答案 0 :(得分:2)

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

我用一个简单的模型试了一下,然后观察了探查器中发生了什么。 在像您这样的示例中,EF会先使用SELECT获取记录,然后使用所需的exec sp_executesql运行UPDATE

不幸的是,我很确定你不能让EF以更聪明的方式做到这一点。

即使您将代码缩短为:

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

它仍会在单独的SELECTUPDATE中执行。

我认为这只是您未直接使用SQL访问数据库所支付的价格。

正如Sriram Sakthivel和other questions所指出的,您可以使用EntityFramework.Extended(也可通过nuget获得)在一次运行中执行此操作,您不需要{{ 1}}再多。

只需将包添加到项目中即可

SaveChanges()

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

using EntityFramework.Extensions;

在随后发送到DBMS的原始SQL中,它将如下所示:

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

不完全漂亮,但仍比两个单独的陈述更好,呵呵:)?