web-dev-qa-db-ja.com

Entity Framework Refreshコンテキスト?

コンテキストを更新するにはどうすればよいですか?データベースからのビューに基づいたエンティティがあり、ビューへのナビゲーションプロパティを持つ1つのテーブルエンティティを更新すると、エンティティは更新されますが、ビューは新しい更新に従って更新されません... Dbデータ。ありがとう!

81
user2528557

コンテキスト内のエンティティを更新する最良の方法は、コンテキストを破棄して新しいコンテキストを作成することです。

really何らかのエンティティを更新する必要があり、DbContextクラスでCode Firstアプローチを使用している場合、

    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

77
RX_DID_RX
yourContext.Entry(yourEntity).Reload();
58
kravits88

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-loaded-entities-from-database/

24

Refresh メソッドを使用します。

context.Refresh(RefreshMode.StoreWins, yourEntity);

または、現在のコンテキストを破棄して新しいコンテキストを作成します。

13
Alberto

context.Reload()はMVC 4、EF 5では機能していなかったので、これを行いました。

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

そして、その正常に動作します。

パフォーマンスが低下するため、Reloadを使用したdbコンテキストの更新は推奨されません。各操作を実行する前に、dbcontextの新しいインスタンスを初期化することは十分であり、ベストプラクティスです。また、各操作の最新のコンテキストを更新します。

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

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