我的应用程序中有以下代码
using (ApplicationDbContext ctx = new ApplicationDbContext())
{
Instance i = ctx.Instance.FirstOrDefault(s => s.Id == id);
i.Views++;
ctx.SaveChanges();
}
有更有效的方法来实现这一目标吗?或者EF足够聪明,能够实现最新情况并生成简单的更新语句,而不是运行选择然后更新吗?
任何帮助都会很好或者指导它应该如何运作。
答案 0 :(得分:2)
不,EF不够聪明,无法一次完成这两件事。
我用一个简单的模型试了一下,然后观察了探查器中发生了什么。
在像您这样的示例中,EF会先使用SELECT
获取记录,然后使用所需的exec sp_executesql
运行UPDATE
。
不幸的是,我很确定你不能让EF以更聪明的方式做到这一点。
即使您将代码缩短为:
Instance i = ctx.Instance.First(s => s.Id == id).Views++;
ctx.SaveChanges();
它仍会在单独的SELECT
和UPDATE
中执行。
我认为这只是您未直接使用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 });
不完全漂亮,但仍比两个单独的陈述更好,呵呵:)?