Выше не работает. Метод 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);
Нак