我也想在我的MVC 4 /实体框架自动化审计领域的人口5申请。我使用@ Eranga的答案信息及本博客:http://lourenco.co.za/blog/2013/07/audit-trails-concurrency-and-soft-deletion-with-entity-framework/,使我这个方法工作,Ninject - 发帖的情况下,有价值的其他人:
创建一个接口和抽象类:
public interface IAuditableEntity {
DateTime? CreatedDate { get; set; }
string CreatedBy { get; set; }
DateTime? LastModifiedDate { get; set; }
string LastModifiedBy { get; set; }
}
public abstract class AuditableEntity:IAuditableEntity {
public DateTime? CreatedDate { get; set; }
public string CreatedBy { get; set; }
public DateTime? LastModifiedDate { get; set; }
public string LastModifiedBy { get; set; }
}
使用过在我的实体:
public class DataEntity : AuditableEntity {
public int DataEntityID { get; set; }
...
}
增加了一个构造函数来MyDbContext其接受的HttpContext和压倒的SaveChanges:
public EFDbContext(HttpContext context) {
_context = context;
}
public HttpContext _context {
get;
private set;
}
public override int SaveChanges() {
DateTime currentDateTime = DateTime.Now;
foreach (var auditableEntity in ChangeTracker.Entries<IAuditableEntity>()) {
if (auditableEntity.State == EntityState.Added || auditableEntity.State == EntityState.Modified) {
auditableEntity.Entity.LastModifiedDate = currentDateTime;
switch (auditableEntity.State) {
case EntityState.Added:
auditableEntity.Entity.CreatedDate = currentDateTime;
auditableEntity.Entity.CreatedBy = _context.User.Identity.Name;
break;
case EntityState.Modified:
auditableEntity.Entity.LastModifiedDate = currentDateTime;
auditableEntity.Entity.LastModifiedBy = _context.User.Identity.Name;
if (auditableEntity.Property(p => p.CreatedDate).IsModified || auditableEntity.Property(p => p.CreatedBy).IsModified) {
throw new DbEntityValidationException(string.Format("Attempt to change created audit trails on a modified {0}", auditableEntity.Entity.GetType().FullName));
}
break;
}
}
}
return base.SaveChanges();
}
最后 - 需要每个请求都有一个DbContext,并根据此回答传递HttpContext,如下所示:https://stackoverflow.com/a/3617961/1803682 - 请注意,因为MyDbContext
现在是Request范围,所以Repositories也必须如此。
kernel.Bind<IDataRepository>()
.To<EFDataRepository>()
.InRequestScope();
kernel.Bind<MyDbContext>().ToSelf()
.InRequestScope()
.WithConstructorArgument("context", ninjectContext=>HttpContext.Current);
我真的很喜欢构造函数注入方法。谢谢! – norepro
是的,好主意,构造函数注入。 – ProfK