通过OnContextCreated()访问实体部分类中的用户?

时间:2012-02-23 15:22:34

标签: asp.net-mvc-3 entity-framework-4.1

我的所有表都有共同的审计字段:modifiedBy,modifiedDateTime等

我想自动设置这些,并可以使用以下代码设置其中大部分:

partial class myEntities
{
  partial void OnContextCreated()
  {
     this.SavingChanges += new EventHandler(Entities_SavingChanges);
  }

  private void Entities_SavingChanges(object sender, EventArgs e)
  {

     IEnumerable<ObjectStateEntry> objectStateEntries =
         from ose
         in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
         where ose.Entity != null
         select ose;

     var auditDate = DateTime.Now;
     var auditUser = System.Web.HttpContext.Current.User.Identity.Name;//I wish

     foreach (ObjectStateEntry entry in objectStateEntries)
     {
        ReadOnlyCollection<FieldMetadata> fieldsMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata;
        FieldMetadata modifiedField = fieldsMetaData.Where(f => f.FieldType.Name == "ModifiedBy").FirstOrDefault();
        if (modifiedField.FieldType != null)
        {
           string fieldTypeName = modifiedField.FieldType.TypeUsage.EdmType.Name;
           if (fieldTypeName == PrimitiveTypeKind.String.ToString())
           {
              entry.CurrentValues.SetString(modifiedField.Ordinal, auditUser);
           }
        }
     }

  }

}

问题在于,似乎没有任何方式可以访问当前用户。该应用程序仅限Intranet,使用Windows身份验证。

有没有办法传递一个参数,或者访问HttpContext(看起来这不是一个好主意,但是我被卡住了)?有没有办法用事件填充EventArgs?

1 个答案:

答案 0 :(得分:0)

Check out海报覆盖了SaveChanges方法的部分(页面上的第6个代码框)。这样,您可以传入UserID并执行审计,而不必使用事件处理程序。