コンテキストを更新するにはどうすればよいですか?データベースからのビューに基づいたエンティティがあり、ビューへのナビゲーションプロパティを持つ1つのテーブルエンティティを更新すると、エンティティは更新されますが、ビューは新しい更新に従って更新されません... Dbデータ。ありがとう!
コンテキスト内のエンティティを更新する最良の方法は、コンテキストを破棄して新しいコンテキストを作成することです。
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();
}
yourContext.Entry(yourEntity).Reload();
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);
}
とにかく最善のアドバイスは、「短命のコンテキスト」を使用するようにして、この種の問題を回避することです。
私はこの問題に関する記事をいくつか書きました。
Refresh メソッドを使用します。
context.Refresh(RefreshMode.StoreWins, yourEntity);
または、現在のコンテキストを破棄して新しいコンテキストを作成します。
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
}
私のシナリオでは、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);
}