プロパティがEFコアのナビゲーションプロパティであるかどうかを判断する

c# entity-framework-core

質問

私は、Sql Azureデータベースへのすべての編集をキャプチャするための簡単な変更トラッカーを構築しています(残念ながら、Sql Azureはネイティブでこれをサポートしていません)。

私は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つの方法があるかどうか不思議です。

受け入れられた回答

反射を使うのではなく

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

EntityEntry.Metadataプロパティによって提供されるメタデータを使用できます。

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

Metadataプロパティによって返されるIEntityTypeは、単純なプロパティ( GetPropertiesメソッド)とナビゲーションプロパティ( GetNavigations拡張メソッド)のための個別のメソッドがあります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ