代码之家  ›  专栏  ›  技术社区  ›  keithwarren7

将更改注入模型数据

  •  1
  • keithwarren7  · 技术社区  · 14 年前

    我有一些实体有审计跟踪元素,比如LastUpdated和LastUpdatedBy。我想确定在模型更改时,将这些字段更新为当前日期和时间以及当前用户的最合适方法。

    以前有人处理过这个问题吗?你的解决方案是什么?你有什么建议?

    (ps mvc和ef noob,因此可能缺少框架类型选项)

    2 回复  |  直到 14 年前
        1
  •  2
  •   TheCloudlessSky    14 年前

    我遵循了与@Nix类似的模式,只是我不使用T4,因为我更喜欢代码优先开发,而不是设计器。如果你有 Context MyDbContext ,可以对其进行部分分类以重写 SaveChanges() 方法。我还有一个 IAuditable 类的所有必需实体都从中扩展。

    public interface IAuditable
    {
        User CreatedBy { get; set; }
        DateTime? DateCreated { get; set; }
        User ModifiedBy { get; set; }
        DateTime? DateModified { get; set; }
        User DeletedBy { get; set; }
        DateTime? DateDeleted { get; set; }
    }
    
    // Classes that implement the IAuditable here.
    
    public class User : EntityObject
    {
        public string Username { get; set; }
        public string DisplayName { get; set; }
        // etc...
    }
    
    partial class MyDbModel
    {
        public override int SaveChanges(SaveOptions options)
        {
    
            // Search all added, modified or deleted entities.
            var entries = this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);
    
            foreach (var entry in entries)
            {
    
                var auditable = entry.Entity as IAuditable;
    
                if (auditable != null)
                {
                    if (entry.State == EntityState.Added)
                    {
                        auditable.CreatedBy = null; // TODO - Get current user.
                        auditable.DateCreated = DateTime.Now;
                        auditable.ModifiedBy = null; // TODO - Same as CreatedBy?
                        auditable.DateModified = DateTime.Now;
                    }
                    else if (entry.State == EntityState.Modified)
                    {
                        auditable.ModifiedBy = null; // TODO - Get current user.
                        auditable.DateModified = DateTime.Now;
                    }
                    else if (entry.State == EntityState.Deleted)
                    {
                        auditable.DeletedBy = null; // TODO - Get current user.
                        auditable.DateDeleted = DateTime.Now;
                    }
                }
            }
    
    
            return base.SaveChanges(options);
        }
    }
    
        2
  •  0
  •   Nix    14 年前

    我做过这样的事情,我用了T4模板。见: Entity Framework Trigger Like Auditing

    基本上我只是让所有实体扩展一个接口,然后在SaveChanges中遍历所有“IAuditable”并设置更新/插入日期。