簡體   English   中英

如何在實體框架中循環創建和刪除記錄

[英]How do I create and delete records in Entity Framework in a loop

我們有一個 postgres 數據庫來存儲Event對象並使用實體框架作為我們的 ORM。

在定期運行的后台服務中,我們希望獲取所有過期事件,將它們從Event表中刪除並將它們移動到EventArchive表中。

我們有一個服務 class ExpiredEventService檢索所有過期事件並將它們傳遞到存儲庫 class 用於刪除和創建EventArchive項目。

通過日志記錄,我們注意到確實檢索到了過期事件,並且刪除和創建存檔項的代碼不會導致異常。

但是,項目不會被刪除,也不會創建EventArchive項目。

我們使用以下代碼將這些項目移動到存檔:

public async Task MoveEventsToArchive(IList<Event> events, CancellationToken cancellationToken)
{
    using (var dbContextTrans = _dbContext.Database.BeginTransactionAsync(IsolationLevel.ReadUncommitted, cancellationToken))
    {
        foreach(var event in events)
        {
            var archiveItem = new ArchiveEvent(event);
            archiveItem.Status = EventStatus.Archived;
            _dbContext.ArchiveEvents.Add(archiveItem);
            _dbContext.Events.Remove(event);
        }
        await _dbContext.SaveChangesAsync(cancellationToken);
    }
}

這樣做的正確方法是什么?

你必須提交你的交易。 我還建議使用 AddRange 和 RemoveRange 方法來提高性能。

using (var transaction = _dbContext.Database.BeginTransactionAsync())
{
  var archives = new List<ArchiveEvent>();
  foreach(var event in events)
  {
    var archiveItem = new ArchiveEvent(event);
    archiveItem.Status = EventStatus.Archived;
    archives.Add(archiveItem);              
  }
  _dbContext.ArchiveEvents.AddRange(archives);
  _dbContext.Events.RemoveRange(events);
  await _dbContext.SaveChangesAsync();
  await transaction.CommitAsync();
}

注意:如果 AddRange 導致 PK 插入問題並且您可以更改 model,請將其添加到您的 PK 中:

public class ArchiveEvent
{ 
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public long id { get; set; }
  //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM