0

優しくしてください。初めての投稿なので、用語が正しく理解できていない場合は申し訳ありません。

で、監査コードEntity Frameworkを書く必要があります。

データベースを継承するコンテキストクラスがありますDbContext。 および各エンティティのSetInitializerMyです。DbSets

また、監査を行っている SaveChanges のオーバーライドもあります。

監査には、 NoneBasic、およびAllPropertiesの 3 つのレベルがあり、各エンティティには異なるプロパティが割り当てられています。この場合、AllProperties 監査を実行しようとしています。

これは、修正された各プロパティの新しいレコードを書き込むために foreach でEntityState.Modified使用している場所で機能しますGetModifiedProperties

しかし、 for で同じことを行うのに問題があります。ループできる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