2012-02-23 26 views
0

我所有的表都有共同的审计领域:modifiedBy,modifiedDateTime等通过OnContextCreated()访问实体部分类中的用户?

我想有这些自动设置,并可以设置大多用下面的代码:

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); 
      } 
     } 
    } 

    } 

}

问题是,似乎没有任何方法可以访问当前用户。该应用程序仅使用内部网,使用Windows身份验证。

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

回答

0

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