38

Con EF4 CTP5 DbContext, lo que es el equivalente de estainstancia de la entidad de actualización con DbContext

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

He intentado esto pero no hace lo mismo, la actualización de la instancia

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

?

Respuesta

53

Debe utilizar este:

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

Lo anterior no funciona. El método Reload() no actualiza correctamente la entidad desde la base de datos. Realiza consultas de selección de SQL pero no crea proxies para las propiedades de navegación. Véase el siguiente ejemplo (que usar la base de datos Northwind en 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<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) 

me puede concluir que la verdadera actualización/recarga de la entidad EF se puede hacer mediante Separar + Encontrar:

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

Nakov

+8

Desde un NAA de @ Dimitar-Dimitrov: 'Se utiliza el constructor de la clase POCO para crear un nuevo objeto de Productos y por lo tanto, no será un proxy. Debe usar el método DbSet.Create para obtener el proxy. Cuando separa la entidad del contexto y la carga desde la base de datos con el método Find, Entity Framework creará un proxy para la entidad. Es por eso que funciona con Detach + Find. Sin embargo, el método DbEntityEntry.Reload no actualizará las relaciones de la entidad. ' – bummi

+1

@bummi Gracias por publicar esa cita. El uso de DbSet.Create en lugar de solo "nuevo " para inicializar mi entidad permitió que mis propiedades de navegación funcionaran después de guardar los cambios y volver a cargar la entidad. –

+0

Muchas gracias. Esto funciona para mí Reload no funciona tampoco cuando los datos se han modificado fuera de EF. – user1841243

0

Descubrí que la recarga falla en las entidades proxy que tienen propiedades de navegación.

Como solución, restablecer los valores de corriente y vuelva a cargar la siguiente manera:

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