在实体框架中的任何删除之前更新

时间:2016-04-27 12:01:58

标签: c# entity-framework

出于审核目的,我需要更新一个列" 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触发。

1 个答案:

答案 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