2016-10-04 2 views
0

Я создаю простой трекер изменений, чтобы захватить все изменения в базу данных Sql Azure (к сожалению, Sql Azure не поддерживает это изначально, насколько я могу судить) ,Определить, является ли свойство навигационным свойством в EF Core

Я иду список измененных записей, возвращаемых 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()) 

Обратите внимание, что IEntityType возвращаемого Metadata собственности имеют отдельные методы для простых свойств (GetProperties метод) и навигационные свойства (GetNavigations метод расширения).

Смежные вопросы