0

温柔一点,如果我第一次没有正确理解术语,这是我的第一篇文章,非常抱歉。

Entity Framework我需要编写一些审计代码

我有一个上下文类,它继承DbContext了我的数据库。 SetInitializer和我DbSets的每个实体。

我还在进行审核的地方覆盖了 SaveChanges。

有 3 个审计级别,NoneBasicAllProperties,每个实体都有一个不同的属性分配给它,在这种情况下,我正在尝试进行 AllProperties 审计。

这适用于EntityState.ModifiedGetModifiedProperties在 foreach 中为每个修改的属性编写新记录的地方

但是我在为 做同样的事情时遇到了麻烦EntityState.Added,似乎没有一个等价物GetNewProperties可以循环通过。

case AuditType.AllProperties:
{
  if (entry.State == EntityState.Modified)
  {
    foreach (var propertyName in entry.GetModifiedProperties()
      .Where(propertyName => propertyName != "Id" && propertyName != "RowVersion"))
      {
        var original = entry.OriginalValues;
        var oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString();

        var current = entry.CurrentValues;
        var newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString();

        //if (oldValue != newValue) // probably not necessary
        //{

        AuditTrails.Add(new AuditTrail
          {
            DomainId = domainId,
            Controller = "",
            Action = "",
            EntityType = entry.Entity.GetType().Name,
            EntityId = entityId,
            Property = propertyName,
            Before = oldValue,
            After = newValue
           });
       }
     }
     else
     {

       AuditTrails.Add(new AuditTrail
         {
           DomainId = domainId,
           Controller = "",
           Action = "",
           EntityType = entry.Entity.GetType().Name,
           EntityId = entityId,
           EntityValue = entry.Entity.ToString(),
           Property = "",
           Before = "",
           After = entry.State.ToString()
         });
}

任何人都可以帮忙吗?

4

2 回答 2

0

每当您调用entry.OriginalValues时,您都可以访问该PropertyNames属性,这将为您提供所有属性的列表。由于它是一个新条目,所以无论如何它们都是新的。

于 2013-10-22T11:34:13.660 回答
0

以下现在适用于我

if (entry.State == EntityState.Added)
                    {
                        for (var i = 0; i < entry.CurrentValues.FieldCount; i++)
                        {
                            var propertyName = entry.CurrentValues.DataRecordInfo.FieldMetadata[i].FieldType.Name;

                            if (propertyName == "Id") continue;
                            if (propertyName == "RowVersion") continue;

                            AuditTrails.Add(new AuditTrail
                                                {
                                                    DomainId = domainId,
                                                    Controller = "",
                                                    Action = entry.State.ToString(),
                                                    EntityType = entityType,
                                                    EntityId = entityId,
                                                    EntityValue = "", //entityValue,
                                                    Property = propertyName,
                                                    Before = "",
                                                    After = entry.CurrentValues[i].ToString(),
                                                });
                        }
                    }
于 2013-11-05T15:26:49.573 回答