【问题标题】:Table Auditing In DbContextDbContext 中的表审计
【发布时间】:2012-12-03 21:23:46
【问题描述】:

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

有没有办法告诉 Entity Framework 在“要更新的列”列表中包含额外的未映射列值?

谢谢!

【问题讨论】:

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

标签: entity-framework


【解决方案1】:

嗯...审计不可知论...所以您不知道这些字段是否开始存在?还是您不在乎是否设置了字段?

如果是后者,您可以只添加列而不需要它们吗?我个人通过继承将 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();
    }     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2020-01-05
    • 2021-12-19
    • 2023-03-18
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多