Обновить экземпляр сущности с помощью DbContext - PullRequest
40 голосов
/ 07 марта 2011

С EF4 CTP5 DbContext, что эквивалентно этому

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

Я пробовал это, но это не делает того же, обновляя экземпляр

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

Ответы [ 3 ]

56 голосов
/ 07 марта 2011

Вы должны использовать это:

public void Refresh(Document instance)
{
  _ctx.Entry<Document>(instance).Reload();
}
24 голосов
/ 15 августа 2013

Выше не работает. Метод Reload () неправильно обновляет сущность из базы данных. Он выполняет запрос выбора SQL, но не создает прокси для навигационных свойств. Смотрите пример ниже (я использую базу данных Northwind в SQL Server с 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)

Я могу заключить, что реальное обновление / перезагрузка объекта EF может быть выполнено Detach + Find:

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

Нак

0 голосов
/ 05 ноября 2014

Я обнаружил, что перезагрузка не удалась для прокси-объектов, имеющих свойства навигации.

В качестве обходного пути сбросьте текущие значения и затем перезагрузите их так:

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