我正在构建一个简单的更改跟踪器来捕获对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块中......但我很好奇是否有另一种方法可以确定属性是导航或相关属性,也许是从元数据中确定的。
答案 0 :(得分:2)
而不是使用反射
foreach (var prop in entry.Entity.GetType().GetTypeInfo().DeclaredProperties)
您可以使用EntityEntry.Metadata
属性提供的元数据:
foreach (var prop in entry.Metadata.GetProperties())
请注意,IEntityType
属性返回的Metadata
具有单独的方法,用于简单属性(GetProperties
方法)和导航属性(GetNavigations
扩展方法)。