Ho cercato di refactoring alcuni codice EF6 per EF Core 1 e ho colpito un piccolo ostacolo. Il codice che sto tentando di convertire è qui:
https://github.com/mehdime/DbContextScope
Tutto è in gran parte buono ma DbContextScope.cs in particolare si sta rivelando difficile, ad esempio questo metodo (modificato per brevità):
public void RefreshEntitiesInParentScope(IEnumerable entities)
{
foreach (IObjectContextAdapter contextInCurrentScope in
_dbContexts.InitializedDbContexts.Values)
{
var correspondingParentContext =
_parentScope._dbContexts.InitializedDbContexts.Values
.SingleOrDefault(parentContext =>
parentContext.GetType() == contextInCurrentScope.GetType())
as IObjectContextAdapter;
if (correspondingParentContext == null)
continue;
foreach (var toRefresh in entities)
{
ObjectStateEntry stateInCurrentScope;
if (contextInCurrentScope.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(toRefresh, out stateInCurrentScope))
{
var key = stateInCurrentScope.EntityKey;
ObjectStateEntry stateInParentScope;
if (correspondingParentContext.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(key, out stateInParentScope))
{
if (stateInParentScope.State == EntityState.Unchanged)
{
correspondingParentContext.ObjectContext.Refresh(
RefreshMode.StoreWins, stateInParentScope.Entity);
}
}
}
}
}
}
Domande.
In primo luogo, so che posso sostituire ObjectContext.ObjectStateManager con il nuovo ChangeTracker ma voglio assicurarmi che la voce che ottengo sia ottenuta correttamente. Come sarebbe la seguente riga tradotta in EF Core?
contextInCurrentScope.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(toRefresh, out stateInCurrentScope)
In secondo luogo, qual è l'equivalente di questo in EF Core?
correspondingParentContext.ObjectContext.Refresh
Grazie!
Ps Ci sono molti commenti utili nella fonte al repo GitHub sopra.
Penso che il modo corretto per ottenere la voce di un'entità e, di conseguenza, le sue chiavi e lo stato, sia tramite:
var entry = contextInCurrentScope.Entry(toRefresh);
var keys = entry.Metadata.GetKeys();
var state = entry.State;
puoi anche aggiornare una singola entità dal database usando la voce come segue:
entry.Reload();