确定属性是否为EF Core中的导航属性

本文关键字:属性 Core 导航 是否 EF | 更新日期: 2023-09-27 18:11:43

我正在构建一个简单的更改跟踪器来捕获对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块…但我很好奇是否有另一种方法来确定,也许从元数据,一个属性是一个导航或相关的属性。

确定属性是否为EF Core中的导航属性

而不是使用反射

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

您可以使用EntityEntry.Metadata属性提供的元数据:

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

请注意,Metadata属性返回的IEntityType有单独的方法用于简单属性(GetProperties方法)和导航属性(GetNavigations扩展方法)。