ASP MVC / EF6 - 自动记录

时间:2014-07-31 08:25:35

标签: entity-framework logging asp.net-mvc-5 dbcontext dbset

我的数据库的每个表最后都有2列,允许记录(执行操作的用户和操作的日期)。 编辑:我使用Code-First迁移 所以我希望自动填充这两个日志列:

  1. 每次我在表格中插入一个新条目(使用DbContext。[Model] .Add(entry))

  2. OR 每次我执行DbContext.SaveChanges()操作


  3. 我考虑过重写DbContext.SaveChanges()方法,但它没有成功......

    我也尝试重写DbSet Add()方法,在那里执行日志填充操作。为此,我创建了一个继承自DbSet的CustomDbSet类:

    public class CustomDbSet<TEntity> : DbSet<TEntity> where TEntity : class
        {
            public TEntity Add(TEntity entity)
            {
                //Do logging action here
                return base.Add(entity);
            }
        }
    

    但这并没有成功。
    编辑:这个CustomDbSet会发生什么,任何DbContext。[Model]现在都返回null(而不是填充数据库表的内容)

    我已经有了将执行日志记录操作的扩展方法,但我不知道在哪里放置它以便日志记录将成为一个&#34;自动&#34;动作..

    public static void EntityLogCreate<T>(this T model, string userName) where T : LogColumns
    {
        model.Create_User = userName;
        model.Create_Date = DateTime.Now;
    }
    

    有任何想法可以实现吗?

1 个答案:

答案 0 :(得分:0)

以下是如何操作的示例。

public class AppContext : DbContext
{
    public DbSet<Item> Items { get; set; }
    public override int SaveChanges()
    {
        int actionById = 1; // Need a way to get the user who does the action.
        DateTime actionDate = DateTime.Now;
        var entries = ChangeTracker.Entries<IAuditLog>();
        foreach (var entry in entries)
        {
            if (entry.State != EntityState.Added && entry.State != EntityState.Modified) continue;
            // Only added and modified entries.
            entry.Entity.ActionById = actionById;
            entry.Entity.ActionDate = actionDate;
        }
        return base.SaveChanges();
    }
}
public interface IAuditLog
{
    int? ActionById { get; set; }
    DateTime? ActionDate { get; set; }
}
public class Item : IAuditLog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ActionById { get; set; }
    public DateTime? ActionDate { get; set; }
}