簡體   English   中英

如何在 Entity Framework Core 中模擬 SQL 觸發器(代碼優先)?

[英]How to emulate a SQL trigger in Entity Framework Core (code first)?

實體框架不支持觸發器。 有什么東西可以復制他們的行為嗎?

我對在我的代碼中插入 SQL 查詢不感興趣。

我有這個問題,因為我有一個案例,我想在我的數據庫中創建一個新表,只要在另一個現有表中插入內容,該表就會填充信息。

像這樣:

  • 假設我有一個Prodcuts表。 我想創建ProductsStatus表。

  • 如果將某些內容插入到Products表中,我想向ProductStatus表中添加一條記錄,存儲該ProductId (外鍵)、一個DateTime列和一個Stored狀態。

  • 關鍵是要避免重構我在代碼上添加產品的每個地方,以便執行此新操作。

我在某些情況下會做這樣的事情:

public partial class XContext : DbContext
{

    private void TrackDates()
    {
        foreach (var entityEntry in ChangeTracker.Entries())
        {
            if (entityEntry.Entity is BaseEntity be)
            {
                switch (entityEntry.State)
                {
                    case EntityState.Deleted: //soft delete instead
                        entityEntry.State = EntityState.Modified;
                        be.DeletedDate = DateTime.UtcNow;
                        break;
                    case EntityState.Modified:
                        be.ModifiedDate = DateTime.UtcNow;
                        be.CreatedDate = DateTime.UtcNow;
                        break;
                    case EntityState.Added:
                        be.CreatedDate = DateTime.UtcNow;
                        break;
                }
            }
        }
    }

    public override int SaveChanges()
    {
        TrackDates();
        return base.SaveChanges();
    }
    public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
    {
        TrackDates();
        return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
    }
}

每次調用 SaveChanges 時,它都會更新 UpdatedDate,或者標記一個 DeletedDate 以進行軟刪除等,這“有點像某些觸發器有時會做的事情”.. 也許您可以擴展它來滿足您的一些需求..

暫無
暫無

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

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