Aggiorna l’istanza dell’entity framework con DbContext

Con EF4 CTP5 DbContext, qual è l’equivalente di questo

public void Refresh(Document instance) { _ctx.Refresh(RefreshMode.StoreWins, instance); } 

Ho provato questo, ma non fa la stessa cosa, aggiornando l’istanza

  public void Refresh(Document instance) { _ctx.ChangeTracker.DetectChanges(); } 

?

Devi usare questo:

 public void Refresh(Document instance) { _ctx.Entry(instance).Reload(); } 

Quanto sopra non funziona. Il metodo Reload () non aggiorna correttamente l’entity framework dal database. Esegue query di selezione SQL ma non crea proxy per le proprietà di navigazione. Vedere l’esempio di seguito (utilizzo il database Northwind in SQL Server con EF 5.1):

 NorthwindEntities northwindEntities = new NorthwindEntities(); Product newProduct = new Product { ProductName = "new product", Discontinued = false, CategoryID = 3 }; northwindEntities.Products.Add(newProduct); northwindEntities.SaveChanges(); // Now the product is stored in the database. Let's print its category Console.WriteLine(newProduct.Category); // prints "null" -> navigational property not loaded // Find the product by primary key --> returns the same object (unmodified) // Still prints "null" (due to caching and identity resolution) var productByPK = northwindEntities.Products.Find(newProduct.ProductID); Console.WriteLine(productByPK.Category); // null (due to caching) // Reloading the entity from the database doesn't help! northwindEntities.Entry(newProduct).Reload(); Console.WriteLine(newProduct.Category); // null (reload doesn't help) // Detach the object from the context ((IObjectContextAdapter)northwindEntities).ObjectContext.Detach(newProduct); // Now find the product by primary key (detached entities are not cached) var detachedProductByPK = northwindEntities.Products.Find(newProduct.ProductID); Console.WriteLine(detachedProductByPK.Category); // works (no caching) 

Posso concludere che l’aggiornamento reale / ricarica dell’entity framework EF può essere eseguito da Detach + Find:

 ((IObjectContextAdapter)context).ObjectContext.Detach(entity); entity = context..Find(entity.PrimaryKey); 

Nakov

Ho trovato che il ricaricamento fallisce su entity framework proxy che hanno proprietà di navigazione.

Come soluzione, reimposta i valori correnti e quindi ricarica in questo modo:

 var entry =_ctx.Entry(instance); entry.CurrentValues.SetValues(entry.OriginalValues); entry.Reload();