どうすればコンテキストを更新できますか?データベースのビューに基づくエンティティがあり、ビューへのナビゲーションプロパティを持つ1つのテーブルエンティティに対して更新を行った場合、エンティティは更新ですが、ビューは更新されず、新しい更新に従って更新されません... Dbデータ。ありがとう!
どうすればコンテキストを更新できますか?データベースのビューに基づくエンティティがあり、ビューへのナビゲーションプロパティを持つ1つのテーブルエンティティに対して更新を行った場合、エンティティは更新ですが、ビューは更新されず、新しい更新に従って更新されません... Dbデータ。ありがとう!
回答:
コンテキスト内のエンティティを更新する最良の方法は、コンテキストを破棄して新しいコンテキストを作成することです。
あなたがいる場合、実際にいくつかのエンティティを更新する必要があり、DbContextクラスとコードファーストアプローチを使用している、あなたが使用することができます
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 。リロード
context.ReloadNavigationProperty(parent, p => p.Children);
できますclass Parent { ICollection<Child> Children; }
context.Entry(order).Collection(o => o.NavigationProperty).Query().Load();
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);
または、現在のコンテキストを破棄して新しいコンテキストを作成することもできます。
((IObjectContextAdapter)dbContext).ObjectContext
MVC 4、EF 5ではcontext.Reload()が機能しなかったので、これを行いました。
context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);
そして、その正常な動作。
私のシナリオでは、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);
}
_context.Entry(entity).Reload();
ですか?
.Reload()
はEF6では使用できません。@CsabaToth
パフォーマンスが低下するため、Reloadを使用してdbコンテキストを更新することはお勧めできません。各操作を実行する前に、dbcontextの新しいインスタンスを初期化することは十分であり、ベストプラクティスです。また、各操作の最新のコンテキストを提供します。
using (YourContext ctx = new YourContext())
{
//Your operations
}