问题描述
实体框架不支持触发器。是否有某些东西可以重现他们的行为?
我对在代码中插入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标记为进行软删除等,这“有点像某些触发器有时所做的事情”。