0

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

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

谢谢!

4

1 回答 1

0

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

如果后者可以只添加列但不需要它们吗?我个人通过继承将 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();
    }     
于 2012-12-03T22:16:51.630 回答