Sto costruendo un semplice tracker delle modifiche per acquisire tutte le modifiche su un database Sql Azure (sfortunatamente, Sql Azure non supporta questo in modo nativo, per quanto ne so).
Sto passando l'elenco delle voci modificate restituite da 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;
}
}
}
Sfortunatamente, il recupero delle informazioni PropertyEntry per una proprietà esplode - InvalidOperationException - quando la proprietà è una proprietà di navigazione, sostenendo che la proprietà non può essere trovata.
Potrei semplicemente racchiudere il codice in un blocco try / catch ... ma sono curioso di sapere se esiste un altro modo per determinare, forse dai metadati, che una proprietà è una navigazione o una proprietà correlata.
Piuttosto che usare la riflessione
foreach (var prop in entry.Entity.GetType().GetTypeInfo().DeclaredProperties)
puoi utilizzare i metadati forniti dalla proprietà EntityEntry.Metadata
:
foreach (var prop in entry.Metadata.GetProperties())
Si noti che l' IEntityType
restituito dalla proprietà Metadata
ha metodi separati per le proprietà semplici (metodo GetProperties
) e le proprietà di navigazione (metodo di estensione GetNavigations
).