確定屬性是否為EF Core中的導航屬性

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塊中...但我很好奇是否有另一種方法來確定屬性是導航或相關屬性,可能來自元數據。

一般承認的答案

而不是使用反射

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合法嗎? 是的,了解原因