我知道您可以覆盖对象中的SaveChanges()
方法DbContext
来更新审计属性值。但是,当我想更新审计列而不将它们实际映射到我的实体时会发生什么?
有没有办法告诉实体框架在“要更新的列”列表中包含额外的未映射列值?
谢谢!
我知道您可以覆盖对象中的SaveChanges()
方法DbContext
来更新审计属性值。但是,当我想更新审计列而不将它们实际映射到我的实体时会发生什么?
有没有办法告诉实体框架在“要更新的列”列表中包含额外的未映射列值?
谢谢!
嗯……审计不可知论……所以你不知道这些字段是否一开始就存在?还是您不在乎是否设置了字段?
如果后者可以只添加列但不需要它们吗?我个人通过继承将 CreatedDate、CreatedBy、ModifiedDate、ModifiedBy 添加到我的大多数实体中。IE 你可以有一个像这样的 AuditableEnity 类:
public class AuditableEnity
{
public int? CreatedById { get; set; }
[Display(Name = "Created Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")]
public DateTime? CreatedDate { get; set; }
public int? ModifiedById { get; set; }
[Display(Name = "Modified Date")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy H:mm}")]
public DateTime? ModifiedDate { get; set; }
}
然后你不必用样板属性来搞乱你的所有模型。然后你只需添加一点。
然后你的 SaveChanges() 看起来像这样:
public override int SaveChanges()
{
//Only get changes from the auditable entities
var changeSet = ChangeTracker.Entries<AuditableEnity>();
...
if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
if (entry.State == EntityState.Added)
{
if (entry.Entity.OverrideAuditing == false)
{
entry.Entity.CreatedById = userId;
entry.Entity.CreatedDate = DateTime.UtcNow;
}
}
entry.Entity.ModifiedById = userId;
entry.Entity.ModifiedDate = DateTime.UtcNow;
}
}
return base.SaveChanges();
}