Entity framework DbContext中的表审计

Entity framework DbContext中的表审计,entity-framework,Entity Framework,我知道您可以覆盖DbContext对象中的SaveChanges()方法来更新审核属性值。但是,如果我想更新审计列而不实际将它们映射到我的实体,会发生什么呢 有没有办法告诉实体框架在“要更新的列”列表中包含额外的未映射列值 谢谢 嗯。。。审计不可知论。。。所以你不知道这些字段是否是从这里开始的?还是你不在乎字段是否设置了 如果是后者,您可以只添加列,但不需要它们吗?我个人通过继承将CreatedDate、CreatedBy、ModifiedDate、ModifiedBy添加到我的大多数实体中。也

我知道您可以覆盖
DbContext
对象中的
SaveChanges()
方法来更新审核属性值。但是,如果我想更新审计列而不实际将它们映射到我的实体,会发生什么呢

有没有办法告诉实体框架在“要更新的列”列表中包含额外的未映射列值


谢谢

嗯。。。审计不可知论。。。所以你不知道这些字段是否是从这里开始的?还是你不在乎字段是否设置了

如果是后者,您可以只添加列,但不需要它们吗?我个人通过继承将CreatedDate、CreatedBy、ModifiedDate、ModifiedBy添加到我的大多数实体中。也就是说,你可以有这样一个可审计性类:

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();
    }     
public override int SaveChanges()
{
//仅从可审核实体获取更改
var changeSet=ChangeTracker.Entries();
...
if(变更集!=null)
{
foreach(changeSet.Where(c=>c.State!=EntityState.Unchanged)中的var条目)
{
if(entry.State==EntityState.Added)
{
if(entry.Entity.OverrideAuditing==false)
{
entry.Entity.CreatedById=userId;
entry.Entity.CreatedDate=DateTime.UtcNow;
}
}
entry.Entity.ModifiedById=用户ID;
entry.Entity.ModifiedDate=DateTime.UtcNow;
}
}            
返回base.SaveChanges();
}     

为什么不映射列?我的域模型需要是审计不可知的。此数据仅与DBA相关。