40 votes

Rafraîchir l'instance de l'entité avec DbContext

Avec EF4 CTP5 DbContext, quel est l'équivalent de ceci

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

J'ai essayé ceci mais ça ne fait pas la même chose, mettre à jour l'instance

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

?

56voto

Ladislav Mrnka Points 218632

Vous devez utiliser ceci :

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

24voto

Svetlin Nakov Points 184

Ce qui précède ne fonctionne pas. La méthode Reload() ne rafraîchit pas correctement l'entité depuis la base de données. Elle effectue la requête SQL select mais ne construit pas de proxies pour les propriétés de navigation. Voir l'exemple ci-dessous (j'utilise la base de données Northwind dans SQL Server avec 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<Product>(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)

Je peux conclure que le rafraîchissement / rechargement réel de l'entité EF peut être fait par Detach + Find :

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

Nakov

-1voto

Matstar Points 169

J'ai constaté que le rechargement échoue sur les entités proxy qui ont des propriétés de navigation.

Pour contourner ce problème, réinitialisez les valeurs actuelles et rechargez-les comme suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X