web-dev-qa-db-de.com

Entity Framework Kontext aktualisieren?

Wie kann ich meinen Kontext aktualisieren? Ich habe Entitäten basierend auf Ansichten aus meiner Datenbank und wenn ich eine Aktualisierung über eine Tabelle vorgenommen habe, Entität, die Navigationseigenschaften zu Ansichten hat, ist die Entität aktualisiert, aber die Ansicht wird nicht entsprechend den neuen Aktualisierungen aktualisiert ... möchte nur erneut von erhalten die Db die Daten. Vielen Dank!

83
user2528557

Die beste Möglichkeit, Entitäten in Ihrem Kontext zu aktualisieren, besteht darin, Ihren Kontext zu entsorgen und einen neuen zu erstellen.

Wenn Sie wirklich eine Entität aktualisieren müssen und den Code First-Ansatz mit der DbContext-Klasse verwenden, können Sie verwenden

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

Mit können Sie die Eigenschaften der Sammlungsnavigation neu laden

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

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

79
RX_DID_RX
yourContext.Entry(yourEntity).Reload();
61
kravits88

Wenn Sie bestimmte Entitäten neu laden möchten, hat Ihnen RX_DID_RX mit DbContextApi bereits die Antwort gegeben.

Wenn Sie alle Entitäten, die Sie geladen haben, neu laden/aktualisieren möchten:

Wenn Sie Entity Framework 4.1+ (EF5 oder EF 6 wahrscheinlich) verwenden, führt die DbContext-API Folgendes aus:

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

Wenn Sie entityFramework 4 (ObjectContext API) verwenden:

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

Der beste Rat ist auf jeden Fall, versuchen Sie, einen "kurzlebigen Kontext" zu verwenden, und Sie werden diese Art von Problemen vermeiden.

Ich habe ein paar Artikel zu diesem Thema geschrieben:

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

24

Verwenden Sie die Refresh Methode:

context.Refresh(RefreshMode.StoreWins, yourEntity);

oder alternativ können Sie Ihren aktuellen Kontext entsorgen und einen neuen erstellen.

13
Alberto

context.Reload () hat in MVC 4, EF 5 nicht funktioniert, also habe ich das gemacht.

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

und es funktioniert gut.

Das Aktualisieren des Datenbankkontexts mit Reload wird aufgrund von Leistungseinbußen nicht empfohlen. Es ist gut genug und die beste Vorgehensweise, vor jeder ausgeführten Operation eine neue Instanz des dbcontext zu initialisieren. Außerdem erhalten Sie einen aktualisierten Kontext für jede Operation.

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

EF 6

In meinem Szenario hat Entity Framework die neu aktualisierten Daten nicht erfasst. Der Grund könnte sein, dass die Daten außerhalb ihres Gültigkeitsbereichs aktualisiert wurden. Das Aktualisieren der Daten nach dem Abrufen hat mein Problem behoben.

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);
}
0
Mahbubur Rahman