2016-10-04 1 views
0

저는 Sql Azure 데이터베이스에 대한 모든 편집 내용을 캡처하는 간단한 변경 추적 프로그램을 구축하고 있습니다. (불행히도 Sql Azure는 기본적으로이 기능을 지원하지 않습니다. . , 속성이 탐색 속성 인 경우 - InvalidOperationException이를 - 속성이 불면의 PropertyEntry 정보를 검색, 불행하게도속성이 EF 코어의 탐색 속성인지 확인합니다.

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; 
     } 
    } 
} 

:

나는 ChangeTracker에 의해 반환 된 수정 된 항목의 목록을() 걷고 있어요 재산을 찾을 수 없다고 주장했다.

try/catch 블록에서 코드를 래핑 할 수는 있지만, 메타 데이터에서 속성이 탐색 또는 관련 속성인지를 확인하는 다른 방법이 있는지 궁금합니다.

답변

1

당신은 EntityEntry.Metadata 속성에 의해 제공되는 메타 데이터를 사용할 수 있습니다 오히려 반사

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

을 사용하는 것보다 :

Metadata 속성에서 반환 IEntityType 단순 속성에 대한 별도의 방법을 가지고
foreach (var prop in entry.Metadata.GetProperties()) 

주 (GetProperties를 메서드) 및 탐색 속성 (GetNavigations 확장 메서드).

관련 문제