【问题标题】:EF Core Update with List带有列表的 EF Core 更新
【发布时间】:2020-08-23 05:35:31
【问题描述】:

要使用 Entity Framework Core 更新 SQL Server 的记录,我查询需要更新的记录,对对象进行更改,然后调用 .SaveChanges()。这很好用而且很干净。

例如:

var emp = _context.Employee.FirstOrDefault(item => item.IdEmployee == Data.IdEmployee);
emp.IdPosition = Data.IdPosition;
await _context.SaveChangesAsync();

但是如果我想更新多条记录,有标准方法吗?

我的第一种方法是使用一个列表将其传递给控制器​​,但我每次都需要遍历该列表并保存更改,因为我认为它不是最佳选择,所以从未真正完成此选项。

现在我所做的不是将列表传递给控制器​​,而是使用 for 将每个对象传递给控制器​​。 (有点像……)

for(int i = 0; i < ObjectList.Count; i ++) 
{
    /* Some code */
    var httpResponseObject = await MyRepositories.Post<Object>(url+"/Controller", Object);
}

然后在控制器上做和以前一样的事情,当只更新一条记录时,为每条记录...

我不认为这是最好的方法,但我还没有找到其他方法。

这样做的最佳方法是什么?

【问题讨论】:

    标签: asp.net .net sql-server entity-framework-core blazor


    【解决方案1】:

    您的问题与 Blazor 无关...但是,我不确定我是否理解问题所在。当您调用 SaveChangesAsync 方法时,您的上下文中的所有更改都将提交到数据库。您不必一次传递一个对象...您可以传递一个对象列表

    希望这会有所帮助...

    【讨论】:

      【解决方案2】:

      使用实体框架或其他对象关系映射 (ORM) 库批量更新记录是一项常见挑战,因为它们将为每个记录运行 UPDATE 命令。您可以尝试使用Entity Framework Plus,这是一个进行批量更新的扩展。

      如果一次调用更新多条记录对您来说至关重要,我建议您只编写一个存储过程并从您的服务调用 if。 Entity Framework 还可以运行直接查询和存储过程。

      看起来用户进行了一些更改,然后保存操作需要同时保留多条记录。您可以触发多个 AJAX 调用,或者,如果需要,只触发一个。

      我要做的是创建一个端点——带有一个 API 控制器和一个动作——它是特定于您的需求的。例如,要更新表中记录的位置:

      控制器:

      /DataOrder
      

      行动:

      [HttpPut]
      public async void Update([FromBody] DataChanges changes)
      {
          foreach(var change in changes)
          {
              var dbRecord = _context.Employees.Find(change.RecordId);
              dbRecord.IdPosition  = change.Position;
          }
          _context.SaveChanges();
      }  
      
      public class DataChanges
      {
          public List<DataChange> Items {get;set;}
      
          public DataChangesWrapper()
          {
              Items = new List<DataChange>();
          }
      }
      
      public class DataChange
      {
          public int RecordId {get;set;}
          public int Position {get;set;}
      }
      

      foreach 语句将为每条记录执行一个UPDATE。但是,如果您需要单个数据库调用,则可以编写 SQL 查询或在数据库中存储一个存储过程,然后将数据作为 DataTable 参数传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 2022-01-14
        • 2022-10-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 2020-11-27
        • 1970-01-01
        相关资源
        最近更新 更多