2

私はEF7/asp.Netコアアプリケーションに問題があります。ChangeTracker.Entries()CurrentValueはEF7(EFコア)のOriginalValueと同じです

public int Save() 
    { 
     ChangeTracker.DetectChanges(); 
     var modifiedEntities = ChangeTracker.Entries() 
      .Where(p => p.State == EntityState.Modified || p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified || p.State == EntityState.Detached).ToList(); 
     var now = DateTime.UtcNow; 

     foreach (var change in modifiedEntities) 
     { 
      var entityName = change.Entity.GetType().Name; 
      var primaryKeyValue = GetPrimaryKeyValue(change.Entity); 
      foreach (var prop in change.Entity.GetType().GetTypeInfo().DeclaredProperties) 
      { 
       if (!prop.GetGetMethod().IsVirtual) 
       { 
        var currentValue = change.Property(prop.Name).CurrentValue; 
        var originalValue = change.Property(prop.Name).OriginalValue; 
        if (originalValue.ToString() != currentValue.ToString()) 
        { 
         var changeLoged = new ChangeLog 
         { 
          PropertyName = prop.Name, 
          EntityName = entityName, 
          PrimaryKeyValue = primaryKeyValue, 
          DateChange = now, 
          OldValue = originalValue.ToString(), 
          NewValue = currentValue.ToString(), 
          ChangedBy = "test" 
         }; 
         ChangeLog.Add(changeLoged); 
        } 
       } 
      } 
     } 
     return base.SaveChanges(); 
    } 

及び方法GetPrimaryKeyValue::

protected virtual int GetPrimaryKeyValue<T>(T entity) 
    { 
     var test = entity; 
     var test2 = test.GetType(); 
     var keyName = this.Model.FindEntityType(test2).FindPrimaryKey().Properties 
      .Select(x => x.Name).Single(); 
     var result = (int)entity.GetType().GetProperty(keyName).GetValue(entity, null); 
     if (result < 0) 
      return -1; 

     return result; 
    } 

Unfortunatlly change.Property(prop.Name).CurrentValueは常にOriginalValueに等しく、そうであれば originalValue.ToString() != currentValue.ToString()

私の文脈では、私は、メソッドの保存を作成します

は常にfalseを返します。

+0

[Audit.EntityFramework](https://github.com/thepirat000/Audit.NET/tree/master/src/Audit.EntityFramework#auditentityframework)ライブラリを見てみましょう。 Contextの 'SaveChanges'をインターセプトして、EF CRUD操作の詳細な監査ログを生成します。 – thepirat000

答えて

4

私はこの問題を再現できないため、これはあなたの質問に正確には答えませんが、これはあなたを助けるかもしれません。 EFコア、PropertyEntryクラスで

は、値が変更されているかどうあなたが知っているようプロパティをするisModifiedました。

あなたは代わりにそれを使用する必要があります。

if (change.Property(prop.Name).IsModified) 
{ 
    var changeLoged = new ChangeLog 
    { 
     PropertyName = prop.Name, 
     EntityName = entityName, 
     PrimaryKeyValue = primaryKeyValue, 
     DateChange = now, 
     OldValue = originalValue.ToString(), 
     NewValue = currentValue.ToString(), 
     ChangedBy = "test" 
    }; 
    ChangeLog.Add(changeLoged); 
} 

免責事項:私はプロジェクトの所有者だEntity Framework Plus

ライブラリ(EFコアをサポート)監査機能を持っているあなたが使用することができますか監査を作成するよう促します(コードはオープンソースです)。

ドキュメント:EF+ Audit

+0

IsModified()を使用していただきありがとうございます! –

関連する問題