如何将修改值发送到删除存储过程



我首先使用实体框架6数据库。我所有实体的CUD操作都映射到.edmx文件中的存储过程。我的删除不是真实的删除 - 它们实际上将IsDeleted列从0到1设置,然后由IsDeleted = 0过滤实体,因此EF不会在Selects中拾取它们。

除了一个问题外,一切都很好。我的实体有一个UpdateDate/UpdateBy列,我想通过当前用户的值和删除时的时间进行更新。因此,我在调用.SaveChanges()之前将它们设置为原始值,而不是我设置的数据库。

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

如何使EF将修改的值发送到删除存储过程?

编辑您想要一些代码,所以就在这里。太微不足道了,我认为它是多余的。

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
        }
}

当我从此方法返回时,我立即在上下文上调用SaveChanges()

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

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

最新更新