15

db からデータをロードしています:

var somethings = Context.SomethingSet.ToList();

その後、誰かがコンテキスト外で行を削除または追加します。Out コンテキストには、オブジェクトが削除されたことがわからないため、削除されたオブジェクトがまだキャッシュされています。Context.SomethingSet.ToList() を呼び出しても、コンテキストにはまだ削除されたオブジェクトが含まれており、ナビゲーション プロパティは正しくありません。

データベースからセット全体を更新する最良の方法は何ですか?

4

3 に答える 3

19

Refreshメソッドは、探しているものです。

Context.Refresh(RefreshMode.StoreWins, somethings);
于 2010-02-25T02:44:52.360 に答える
12

EF データ コンテキストは、Unit of Work パターンの実装です。そのため、実行中の作業単位を超えて保持されるようには設計されていません。作業が完了すると、データ コンテキストが破棄されることが期待されます。

これは、EF v1、EF v4、および LINQ to SQL の両方の基本的な設計上の決定です。非常に具体的なデータ使用パターンと大量のメモリがない限り、作業単位を完了するために絶対に必要な時間よりも長くデータ コンテキストを維持することは避ける必要があります。

http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

于 2010-02-25T02:44:42.443 に答える
1

仮想プロパティの場合、リロードは役に立ちません。デタッチして再度ロードする必要があります

public T Reload<T>(T entity) where T : class, IEntityId
{
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
}
于 2015-03-21T04:14:28.013 に答える