如何在Entity Framework Core中模拟SQL触发器代码优先?

问题描述

实体框架不支持触发器。是否有某些东西可以重现他们的行为?

我对在代码中插入SQL查询不感兴趣。

我有这个问题,因为我想在我的数据库上创建一个新表,每当在另一个现有表中插入某些内容时,该表就会填充信息。

赞:

  • 假设我有一个Prodcuts表。我要创建ProductsStatus表。

  • 如果在Products表中插入了某些内容,我想向ProductStatus表中添加一条记录,并存储ProductId(外键),{{1 }}列和此产品的DateTime状态。

  • 关键是要避免重构在代码上添加产品的每个位置,以便执行此新操作。

解决方法

在某些情况下,我会这样做:

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标记为进行软删除等,这“有点像某些触发器有时所做的事情”。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...