2016-10-04 8 views
0

私はSql Azureデータベースへのすべての編集を取り込むための簡単な変更トラッカーを構築しています(残念ながら、Sql Azureはこれまでサポートしていませんでした。 。プロパティがEFコア内のナビゲーションプロパティであるかどうかを確認

私はChangeTracker(によって返された変更されたエントリ)のリストを歩いている:

foreach(EntityEntry entry in _context.ChangeTracker.Entries() 
    .Where(e => e.State == EntityState.Modified)) 
{ 
    foreach(var prop in entry.Entity 
     .GetType() 
     .GetTypeInfo() 
     .DeclaredProperties) 
    { 
     // this line blows up on navigation properties 
     PropertyEntry propEntry = entry.Property(prop.Name); 

     if(propEntry.IsModified) 
     { 
      var curValue = entry.Property(prop.Name).CurrentValue; 
      var origValue = entry.Property(prop.Name).OriginalValue; 
     } 
    } 
} 

は残念ながら、プロパティのPropertyEntry情報を取得することは吹く - 例外InvalidOperationExceptionを - プロパティは、ナビゲーションプロパティであるとき、不動産を見つけることができないと主張する。

私はtry/catchブロックでコードをラップするだけです...しかし、おそらくメタデータから、プロパティがナビゲーションまたは関連プロパティであるかどうかを判断するもう1つの方法があるかどうか不思議です。

答えて

1

よりもむしろ反射

foreach (var prop in entry.Entity.GetType().GetTypeInfo().DeclaredProperties) 

を使用して、あなたはEntityEntry.Metadataプロパティによって提供されるメタデータを使用することができます:Metadataプロパティによって返さIEntityTypeGetProperties(単純なプロパティのための別の方法を持っていることを

foreach (var prop in entry.Metadata.GetProperties()) 

注意をメソッド)とナビゲーションプロパティ(GetNavigations拡張メソッド)。

関連する問題