Entity Framework Context vernieuwen?

Hoe kan ik mijn context vernieuwen? Ik heb entiteiten op basis van weergaven uit mijn database en toen ik een update maakte over één tabel Entiteit die navigatie-eigenschappen heeft voor weergaven, is de entiteit bijgewerkt, maar de weergave wordt niet vernieuwd volgens de nieuwe updates … wil gewoon opnieuw van de Db de gegevens.
Bedankt!


Antwoord 1, autoriteit 100%

De beste manier om entiteiten in uw context te vernieuwen, is door uw context te verwijderen en een nieuwe aan te maken.

Als u echteen entiteit moet vernieuwen en u de Code First-aanpak met DbContext-klasse gebruikt, kunt u

   public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }

Om de eigenschappen van collectienavigatie opnieuw te laden, kunt u

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

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


Antwoord 2, autoriteit 82%

yourContext.Entry(yourEntity).Reload();

Antwoord 3, autoriteit 36%

Als u specifieke entiteiten opnieuw wilt laden, met de DbContextApi, heeft RX_DID_RX u al het antwoord gegeven.

Als u alle geladen entiteiten opnieuw wilt laden / vernieuwen:

Als u Entity Framework 4.1+ gebruikt (EF5, of EF 6 waarschijnlijk), DbContext API:

public void RefreshAll()
{
     foreach (var entity in ctx.ChangeTracker.Entries())
     {
           entity.Reload();
     }
}

Als u entiteitFramework 4 (ObjectContext API) gebruikt:

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

Het beste advies is hoe dan ook: probeer een “kortstondige context” te gebruiken en je zult dit soort problemen vermijden.

Ik heb er een aantal artikelen over geschreven:

https://christianarg.wordpress.com/2013/ 06/13/entityframework-refreshall-loaded-entities-from-database/


Antwoord 4, autoriteit 16%

Gebruik de Vernieuwenmethode:

context.Refresh(RefreshMode.StoreWins, yourEntity);

of als alternatief, verwijder je huidige context en maak een nieuwe.


Antwoord 5, autoriteit 6%

context.Reload() werkte niet voor mij in MVC 4, EF 5, dus ik deed dit.

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

en het werkt prima.


Antwoord 6, autoriteit 3%

EF 6

In mijn scenario pikte Entity Framework de nieuwe bijgewerkte gegevens niet op. De reden kan zijn dat de gegevens buiten het bereik zijn bijgewerkt. Het vernieuwen van gegevens na het ophalen loste mijn probleem op.

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

Antwoord 7

Het vernieuwen van db-context met Reload wordt niet aanbevolen vanwege prestatieverlies. Het is goed genoeg en de beste praktijk om een ​​nieuwe instantie van de dbcontext te initialiseren voordat elke bewerking wordt uitgevoerd. Het biedt u ook een vernieuwde, up-to-date context voor elke bewerking.

using (YourContext ctx = new YourContext())
{
   //Your operations
}

Other episodes