DbContext中的表审计

时间:2012-12-03 21:23:47

标签: entity-framework

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

有没有办法告诉Entity Framework在“columns-to-update”列表中包含额外的未映射列值?

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯......审核不可知......所以你不知道字段是否在那里开始?或者你不关心字段是否设置?

如果后者可以添加列但是不需要它们吗?我个人通过继承将CreatedDate,CreatedBy,ModifiedDate,ModifiedBy添加到我的大多数实体中。 I.E.你可以有一个像这样的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();
    }