繁体   English   中英

带有列表的 EF Core 更新

[英]EF Core Update with List

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

例如:

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

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

我的第一种方法是使用一个列表将其传递给 controller,但随后我需要通过该列表 go 并每次保存更改,从未真正完成此选项,因为我认为它不是最佳的。

现在我所做的不是将列表传递给 controller,而是使用 for 将每个 object 传递给 controller。 (有点像……)

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

然后像以前一样在 controller 上做同样的事情,当只更新一条记录时,对于每条记录......

我不觉得这是最好的方法,但我还没有找到另一种方法。

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

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

希望这可以帮助...

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

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

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

我要做的是使用 API controller 和特定于您的需求的操作创建一个端点。 例如,要更新表中记录的 position:

Controller:

/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参数传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM