我的数据库的每个表最后都有2列,允许记录(执行操作的用户和操作的日期)。 编辑:我使用Code-First迁移 所以我希望自动填充这两个日志列:
每次我在表格中插入一个新条目(使用DbContext。[Model] .Add(entry))
OR 每次我执行DbContext.SaveChanges()操作
我考虑过重写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;
}
有任何想法可以实现吗?
答案 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; }
}