实体框架通过将当前值增加1而不选择来更新一列

时间:2015-06-03 00:57:06

标签: c# sql entity-framework entity-framework-6

我想要实现的是简单的SQL查询: UPDATE TABLE SET COLUMN = COLUMN + 1

有没有办法让它在没有首先将所有记录(数千)加载到内存并循环遍历每个记录以增加列然后将其保存回来的情况下实现?

修改

我尝试了原始的sql并且它有效。我必须从连接字符串和连接上下文中的数据库模式名称决定sql提供程序。之后,我将使用相应的sql查询来更新表。

对于SQL,它看起来像UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1 。 对于POSTGRESQL,我必须双重引用模式名称,表名和列名: UPDATE" schemaname"。" TABLE" SET" COLUMN" =" COLUMN" + 1

2 个答案:

答案 0 :(得分:2)

使用纯EF,你是对的:你必须逐个加载实体,设置属性,然后保存。非常低效。

我所知道的两个选择是:

  1. 提供原始SQL以根据需要执行UPDATE语句。
  2. 使用EntityFramework.Extended库(https://github.com/loresoft/EntityFramework.Extended),它支持批量UPDATE和具有自然EF感觉的DELETE。
  3. 从他们的主页引用:

      

    批量更新和删除

         

    实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。现在在大多数情况下,这很好。然而,有一些senerios性能会受到影响。此外,对于单个删除,必须先检索该对象,然后才能删除该对象,从而需要对数据库进行两次调用。批量更新和删除消除了在修改实体之前检索和加载实体的需要。

         

    <强>删除

    //delete all users where FirstName matches
    context.Users.Where(u => u.FirstName == "firstname").Delete();
    
      

    <强>更新

    //update all tasks with status of 1 to status of 2
    context.Tasks.Update(
        t => t.StatusId == 1, 
        t2 => new Task {StatusId = 2});
    
    //example of using an IQueryable as the filter for the update
    var users = context.Users.Where(u => u.FirstName == "firstname");
    context.Users.Update(users, u => new User {FirstName = "newfirstname"});
    

答案 1 :(得分:2)

这是解决方案。您可以使用以下代码:

IEditableRule#ALWAYS_EDITABLE
希望它有所帮助。