2017-09-13 29 views
0

私のテーブルが別のパーティによって更新されても、dotnetコアのdbコンテキストは古い値を返しますが、どのようにしてDbコンテキストを更新することができますか?エンティティフレームワークのコアDBContextをリフレッシュするには?

私は研究をしましたが、コンテキストを更新させるために、ReloadメソッドはEFコアでは使用できませんでした。

いくつかの解決策では、使用後にコンテキストを破棄することを提案していますが、DBコンテキストが依存性注入によって作成されているとエラーが表示されます。

+0

彼らは同じコンテキストを共有していますか?変更を保存した後、異なるコンテキストは同じ状態を共有する必要があります。 – Fals

+0

@Fals残念ながら、彼らは同じ文脈を共有していません。 – MiDaa

+0

"AsNoTracking"があなたを助けることができるデータを読み取る必要がある場合のみ。 EFコア:https://docs.microsoft.com/en-us/ef/core/querying/trackingこれは詳細情報です。EFキャッシュバスト:http://codethug.com/2016/02/19/Entity-フレームワーク - キャッシュバスト/ –

答えて

0

あなたはdetachに文脈から実体を持っている、またはここで.Reload()実装だ.Reload()

のためにあなた自身の拡張機能を実装します。出典:https://weblogs.asp.net/ricardoperes/implementing-missing-features-in-entity-framework-core

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

public static TEntity Reload<TEntity>(this EntityEntry<TEntity> entry) where TEntity : class 
{ 
    if (entry.State == EntityState.Detached) 
    { 
     return entry.Entity; 
    } 

    var context = entry.Context; 
    var entity = entry.Entity; 
    var keyValues = context.GetEntityKey(entity); 

    entry.State = EntityState.Detached; 

    var newEntity = context.Set<TEntity>().Find(keyValues); 
    var newEntry = context.Entry(newEntity); 

    foreach (var prop in newEntry.Metadata.GetProperties()) 
    { 
     prop.GetSetter().SetClrValue(entity, 
     prop.GetGetter().GetClrValue(newEntity)); 
    } 

    newEntry.State = EntityState.Detached; 
    entry.State = EntityState.Unchanged; 

    return entry.Entity; 
} 
0

更新が行われたときに相手があなたに通知するのが理想的です。これは、message queueで実現できます。

中でも:Azure Service Bus、Rabbit MQ、0MQ

関連する問題