如何发送修改后的值以删除存储过程

How to send modified values to delete stored procedure

我首先使用 Entity Framework 6 数据库。我所有实体的 CUD 操作都映射到 .edmx 文件中的存储过程。我的 DELETE 不是真正的删除 - 它们实际上设置了一个从 0 到 1 的 IsDeleted 列,然后实体被 IsDeleted = 0 过滤,所以 EF 不会在 SELECT 中选择它们。

除一个问题外,一切正常。我的实体有一个 UpdateDate / UpdateBy 列,我想在删除时用当前用户的值和时间更新它。所以我在调用.SaveChanges()之前设置了它们,但是发送到数据库的是原始值,而不是我设置的值。

值得注意的是,为了删除,我从数据库中提取实体(其中这些字段有一些默认值)并将其标记为删除。

如何让 EF 将修改后的值发送到 DELETE 存储过程?

编辑 你想要一些代码,所以就在这里。太琐碎了我还以为是多余的

public List<Audit> CreateAuditData(DbContext context)
{
    var entries = from e in context.ChangeTracker.Entries()
                  where e.State != EntityState.Unchanged
                  select e;
    foreach (var entry in entries)
    {
        Audit audit = new Audit();
        audit.CreateBy = audit.UserName = HttpContext.Current.User.Identity.Name;
        audit.CreateDate = DateTime.Now;

        IModel model = entry.Entity as IModel;
        switch (entry.State)
        {
        ...
        case EntityState.Deleted:
                model.UpdateBy = audit.CreateBy;
                model.UpdateDate = audit.CreateDate;
        ...
        break
        }
}

当我从这个方法 return 时,我立即在上下文中调用 SaveChanges()

Audit 是其他一些实体,我也会在每次更改时保存它。 IModel 是我所有实体实现的接口,它包含 UpdateDateUpdateBy 属性。

由于 EF 仅将原始值发送到删除存储过程,因此我必须使用要发送到该过程的值修改实体的 DbEntityEntry.OriginalValues 集合。将适当的属性映射到过程参数,我能够在数据库中获取这些值。