如何正确更新 EF Core 中的行

问题描述 投票:0回答:2

我有一个使用 EF Core 在 C# 中创建列表的查询:

 List<DebtCollectionList> debtCollections = 
     _context.Transactions
             .Where(x => x.Status == 0  
                         && x.TransactionDate <= compareDate && !x.Processed)
             .Select(x => new DebtCollectionList
                              {
                                  transaction_id = x.TransactionId,
                                  iin_pan = x.IinPan,
                                  transaction_date = (DateTime)x.TransactionDate,
                                  amount = (decimal)x.Amount
                              })
             .ToList();

然后我对返回的行执行

foreach
。我需要在处理每一行后更改布尔值。

更新

foreach
中每一行的最佳方法是什么。我真的不想运行新的上下文,因为它已经存在了。

foreach (var debt in debtCollections)
{
}
c# entity-framework-core
2个回答
1
投票

您可以使用 EF Core 7

ExecuteUpdate
:

// collect Ids
var transactionIds = debtCollections.Select(t => t.TransactionId).ToList();

_context.Transactions
    .Where(t => transactionIds.Contains(t.TransactionId))
    .ExecuteUpdate(setters => setters.SetProperty(t => t.Processed, true));

-1
投票

要在 Entity Framework Core (EF Core) 上下文中更新 foreach 循环中的每一行而不启动新上下文,您可以按照以下步骤操作。此方法使用与您用来查询交易的相同 _context。关键是在循环内标记每个已处理的事务,然后将更改保存到数据库。

  • 查询和处理交易:由于您已经通过查询获取交易,因此您可以循环遍历它们并更新必要的字段。

  • 更新实体:在

    foreach
    循环中,找到上下文中的每个交易并更新其
    Processed
    字段。

  • 将更改保存到数据库:更新所有必要的事务后,需要将更改保存回数据库。这是在循环之后有效完成的,将所有更改捆绑到单个事务中。

以下是如何修改代码来实现此目的:

List<DebtCollectionList> debtCollections = 
    _context.Transactions
            .Where(x => x.Status == 0 && x.TransactionDate <= compareDate && !x.Processed)
            .Select(x => new DebtCollectionList
                             {
                                 transaction_id = x.TransactionId,
                                 iin_pan = x.IinPan,
                                 transaction_date = (DateTime)x.TransactionDate,
                                 amount = (decimal)x.Amount
                             })
            .ToList();

foreach (var debt in debtCollections)
{
    // Find the transaction by ID in the context
    var transaction = _context.Transactions.FirstOrDefault(t => t.TransactionId == debt.transaction_id);

    // Check if the transaction is not null and mark it as processed
    if (transaction != null)
    {
        transaction.Processed = true;
    }
}

// Save the changes to the database
_context.SaveChanges();
© www.soinside.com 2019 - 2024. All rights reserved.