Entity Framework Обновить контекст?

Как я могу обновить свой контекст? У меня есть сущности, основанные на представлениях из моей базы данных, и когда я сделал обновление для одной таблицы Entity, у которой есть свойства навигации к представлениям, сущность обновляется, но представление не обновляется в соответствии с новыми обновлениями ... просто хочу получить снова от ДБ данные. Спасибо!

72 голоса | спросил user2528557 28 42013vEurope/Moscow11bEurope/MoscowThu, 28 Nov 2013 20:11:34 +0400 2013, 20:11:34

7 ответов


0

Лучший способ обновить сущности в вашем контексте - это избавиться от контекста и создать новый.

Если вам действительно нужно обновить какую-то сущность, и вы используете подход 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();
    }

Ссылка: https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload (v = vs.113) .aspx # M: System.Data. Entity.Infrastructure.DbEntityEntry.Reload

ответил RX_DID_RX 28 42013vEurope/Moscow11bEurope/MoscowThu, 28 Nov 2013 21:38:59 +0400 2013, 21:38:59
0
yourContext.Entry(yourEntity).Reload();
ответил kravits88 2 J000000Wednesday14 2014, 07:55:45
0

Если вы хотите перезагрузить определенные сущности с помощью 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 (ObjectContext API):

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);
}

В любом случае, лучший совет: попробуйте использовать «недолговечный контекст», и вы избежите подобных проблем.

Я написал пару статей по этому вопросу:

https://christianarg.wordpress.com/2013/06/13 /entityframework-refreshall загруженным-объекты-от-базы данных /

ответил Christian Rodriguez 15 J000000Wednesday15 2015, 16:21:19
0

Используйте метод обновления :

context.Refresh(RefreshMode.StoreWins, yourEntity);

или, альтернативно, удалите свой текущий контекст и создайте новый.

ответил Alberto 28 42013vEurope/Moscow11bEurope/MoscowThu, 28 Nov 2013 20:21:23 +0400 2013, 20:21:23
0

context.Reload () не работал для меня в MVC 4, EF 5, поэтому я сделал это.

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);

и работает нормально.

ответил Chaudhary Kaleem Ahmad 7 +03002016-10-07T14:34:32+03:00312016bEurope/MoscowFri, 07 Oct 2016 14:34:32 +0300 2016, 14:34:32
0

Обновление контекста БД с помощью Reload не рекомендуется из-за потери производительности. Это достаточно хорошо и рекомендуется инициализировать новый экземпляр dbcontext перед каждой выполненной операцией. Он также предоставляет обновленный контекст для каждой операции.

using (YourContext ctx = new YourContext())
{
   //Your operations
}
ответил aog 12 +03002015-10-12T22:48:29+03:00312015bEurope/MoscowMon, 12 Oct 2015 22:48:29 +0300 2015, 22:48:29
0

Я заставил мою голову болеть ни за что! Ответ был очень прост Я просто вернулся к основам ...

some_Entities   e2 = new some_Entities(); //your entity.

добавьте эту строку ниже после того, как вы обновите /удалите - вы перезагружаете свою сущность - никаких необычных системных методов.

e2 = new some_Entities(); //reset.
ответил buffy555 5 +04002014-10-05T05:20:52+04:00312014bEurope/MoscowSun, 05 Oct 2014 05:20:52 +0400 2014, 05:20:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132