2016-10-04 121 views
0

我正在构建一个简单的更改跟踪器,以捕获对Sql Azure数据库的所有编辑(不幸的是,Sql Azure本身并不支持此功能,据我所知) 。确定属性是否是EF内核中的导航属性

我走)由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扩展方法)。