Entity Framework Обновить контекст?
Как я могу обновить свой контекст? У меня есть сущности, основанные на представлениях из моей базы данных, и когда я сделал обновление для одной таблицы Entity, у которой есть свойства навигации к представлениям, сущность обновляется, но представление не обновляется в соответствии с новыми обновлениями... просто хочу получить снова от ДБ данные. Спасибо!
7 ответов
Лучший способ обновить сущности в вашем контексте - это избавиться от контекста и создать новый.
Если вам действительно нужно обновить какую-либо сущность и вы используете подход Code First с классом DbContext, вы можете использовать
public static void ReloadEntity<TEntity>(
this DbContext context,
TEntity entity)
where TEntity : class
{
context.Entry(entity).Reload();
}
Чтобы перезагрузить свойства навигации коллекции, вы можете использовать
public static void ReloadNavigationProperty<TEntity, TElement>(
this DbContext context,
TEntity entity,
Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
where TEntity : class
where TElement : class
{
context.Entry(entity).Collection<TElement>(navigationProperty).Query();
}
Если вы хотите перезагрузить определенные объекты с помощью DbContextApi, RX_DID_RX уже дал вам ответ.
Если вы хотите перезагрузить / обновить все загруженные вами объекты:
Если вы используете Entity Framework 4.1+ (возможно, EF5 или EF 6), DbContext API:
public void RefreshAll()
{
foreach (var entity in ctx.ChangeTracker.Entries())
{
entity.Reload();
}
}
Если вы используете entityFramework 4 (API ObjectContext):
public void RefreshAll()
{
// Get all objects in statemanager with entityKey
// (context.Refresh will throw an exception otherwise)
var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
| EntityState.Modified
| EntityState.Unchanged)
where entry.EntityKey != null
select entry.Entity);
context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}
В любом случае, лучший совет: попробуйте использовать "недолговечный контекст", и вы избежите подобных проблем.
Я написал пару статей по этому вопросу:
Используйте метод Refresh:
context.Refresh(RefreshMode.StoreWins, yourEntity);
или, альтернативно, избавьтесь от текущего контекста и создайте новый.
context.Reload() не работал для меня в MVC 4, EF 5, поэтому я сделал это.
context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);
и работает нормально.
EF 6
В моем сценарии Entity Framework не собирала недавно обновленные данные. Причина может быть в том, что данные были обновлены за пределами его области. Обновление данных после получения разрешило мою проблему.
private void RefreshData(DBEntity entity)
{
if (entity == null) return;
((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}
private void RefreshData(List<DBEntity> entities)
{
if (entities == null || entities.Count == 0) return;
((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}
Обновление контекста БД с помощью Reload не рекомендуется из-за потери производительности. Это достаточно хорошо и рекомендуется инициализировать новый экземпляр dbcontext перед каждой выполненной операцией. Он также предоставляет обновленный контекст для каждой операции.
using (YourContext ctx = new YourContext())
{
//Your operations
}
На самом деле я предлагаю удалить всю сущность и воссоздать ее в зависимости от вашего подхода.
Я сделал свою собственную голову болеть из-за ничего! Ответ был очень прост - я просто вернулся к основам...
some_Entities e2 = new some_Entities(); //your entity.
добавьте эту строку ниже после того, как вы обновите / удалите - вы перезагружаете свою сущность - никаких необычных системных методов.
e2 = new some_Entities(); //reset.