我的核心项目在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);
}
}
更新:我总结了solution here。
最佳答案
如果使用EF6的DbContext
,则可以在ChangeTracker
覆盖中使用SaveChanges
来查找已添加/修改的自定义类型的实体,例如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();
}
关于c# - Entity Framework 6 : audit/track changes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26355486/