出于审核目的,我需要更新一个列" UpdatedBy"在删除行之前的某些表上,这将触发一些第三方审核。
我目前的解决方案是在我的Context类上创建自定义SaveChanges方法,但是我对已删除实体所做的任何更改都会被忽略,而生成的SQL只是一个DELETE命令。
是否可以在SaveChanges方法中为实体触发UPDATE和DELETE?
CS代码
public partial class MyContext : DbContext
{
public int SaveChanges(int userId)
{
foreach (var entry in ChangeTracker.Entries<Auditable>())
{
if (entry.State == EntityState.Deleted)
{
entry.Entity.UpdatedBy = userId;
}
}
return base.SaveChanges();
}
}
示例SQL生成
DELETE FROM EntityTable
WHERE Id = @00
所需的SQL
UPDATE EntityTable
SET UpdateBy = @00
WHERE Id = @01
DELETE FROM EntityTable
WHERE Id = @01
更新
为了澄清,我正在使用第三方审核框架,该框架在单独的数据库中创建新行。在DELETE之前执行UPDATE的目的是允许单独的数据库存储执行删除的用户标识。因此,虽然从原始数据库中删除了该行,但需要创建审计行,该行由UPDATE触发。
答案 0 :(得分:2)
实体框架不能强制执行UPDATE以及DELETE,但我可以生成SQL来手动调用更新。并在事务中运行更改。
# find first occurrence
zero.or.not <- do.call("rbind", lapply(xy.split, FUN = function(x) x[1, ]))$oldvar
# count number of rows
num.rows <- unlist(lapply(xy.split, FUN = nrow))
xy.new$newvar2 <- rep(zero.or.not, times = num.rows)
xy.new