一尘不染

实体框架6:审核/跟踪更改

c#

我的核心项目在C#中。

我在一个数据库上工作,其中一些表的“ user_mod”和“ date_mod”列用于签署谁以及何时制作了一些mod,并且与“ data_new”和“
user_new”相同。

我的问题:有没有一种方法可以在我创建的实例的情况下进行集中管理并使此数据自动插入dbContext

如果没有,我将使用审核跟踪工具。我已经看到了其中一些,但是有一个问题:所有这些都需要模型中的一些代码。但是我不想在模型中编写代码,因为如果必须更改它,我将丢失模型。是否可以在不写入模型文件的情况下对EF6使用审核跟踪?怎么样?

编辑:

我试图覆盖saveChanges。

public partial class PieEntities : DbContext
{
    public override int SaveChanges(System.Data.Objects.SaveOptions options)
    {
        var timestamp = DateTime.Now;

        EntityState es = EntityState.Added;
        ObjectStateManager o = new ObjectStateManager();

        foreach (ObjectStateEntry entry in o.GetObjectStateEntries(EntityState.Added ))  {
            if (entry.Entity.GetType() == typeof(TabImpianti)) {
                TabImpianti impianto = entry.Entity as TabImpianti;
                impianto.DATA_INS = timestamp;
                impianto.DATA_MOD = timestamp;
                string u = mdlImpostazioni.p.UserName;
                impianto.USER_INS = u;
                impianto.USER_MOD = u;
            }
        }
        return base.SaveChanges(options);
    }
}

更新:我在 这里总结了解决方案


阅读 210

收藏
2020-05-19

共1个答案

一尘不染

如果使用EF6是DbContext可以使用ChangeTrackerSaveChanges替代找到自定义类型的添加/修改的实体,例如IAuditedEntity。

public interface IAuditedEntity {
  string CreatedBy { get; set; }
  DateTime CreatedAt { get; set; }
  string LastModifiedBy { get; set; }
  DateTime LastModifiedAt { get; set; }
}

public override int SaveChanges() {
  var addedAuditedEntities = ChangeTracker.Entries<IAuditedEntity>()
    .Where(p => p.State == EntityState.Added)
    .Select(p => p.Entity);

  var modifiedAuditedEntities = ChangeTracker.Entries<IAuditedEntity>()
    .Where(p => p.State == EntityState.Modified)
    .Select(p => p.Entity);

  var now = DateTime.UtcNow;

  foreach (var added in addedAuditedEntities) {
    added.CreatedAt = now;
    added.LastModifiedAt = now;
  }

  foreach (var modified in modifiedAuditedEntities) {
    modified.LastModifiedAt = now;
  }

  return base.SaveChanges();
}
2020-05-19