web-dev-qa-db-ja.com

Entity Frameworkに常にデータベースから更新されたデータを取得させるにはどうすればよいですか?

EntityFramework.Extended ライブラリを使用してバッチ更新を実行しています。唯一の問題は、EFがライブラリによって実行されるバッチ更新を追跡しないことです。したがって、再度DbContextを照会すると、更新されたエンティティは返されません。

クエリ中にAsNoTracking()メソッドを使用すると、追跡が無効になり、データベースから新しいデータが取得されることがわかりました。ただし、EFはAsNoTracking()でクエリされたエンティティを追跡しないため、クエリされたデータを更新することはできません。

変更を追跡しながらEFに最新のデータを取得させる方法はありますか?

74
Saravana

単一のエンティティを更新するには、これを試してください:

Context.Entry<T>(entity).Reload()

編集:エンティティのコレクションの最新データを取得するには、各リクエストの後にDbContextインスタンスを破棄する価値があります。

132
PlTaylor

エンティティを更新した後、ナビゲーションプロパティが設定されていなかった問題の解決策を探しているときに、この質問に出くわしました。データベースからエンティティをリロードしようとするたびに、ローカルストアからエントリを取得する代わりに、遅延ロードによってナビゲーションプロパティが設定されません。コンテキストを破棄して再作成する代わりに、プロキシが機能している状態で新しいデータを取得できることがわかりました。

_db.Entry(entity).State = EntityState.Detached;

その背後にあるロジックは-更新がエンティティをアタッチして、変更を追跡することでした。これにより、ローカルストアに追加されます。その後、機能プロキシを使用してエンティティを取得しようとすると、データベースにアクセスして新しいプロキシ対応エンティティを返す代わりに、ローカルプロキシを取得します。上記のリロードオプションを試してみました。これは、データベースからオブジェクトを更新しますが、遅延ロードではプロキシされたオブジェクトを提供しません。 Find(id), Where(t => t.Id = id), First(t => t.Id = id)を試しました。最後に、提供された使用可能な状態を確認し、「切り離された」状態があることを確認しました。ユーレカ!これが誰かを助けることを願っています。

14
Zach

クラスの一部として、割り当てなしでエンティティ変数を宣言しました。これにより、他のメソッドによる参照用の変数を失うことなく、インスタンスを破棄できました。私はちょうどこれに出くわしたので、それはベルトの下で多くのランタイムを持っていませんが、今のところはうまく機能しているようです。

public partial class frmMyForm
{
    private My_Entities entity;

    public frmMyForm()
    {
        InitializeComponent();
    }

    private void SomeControl_Click(object sender, EventArgs e)
    {
        db.SaveChanges();
        db.Dispose();
        entity = new My_Entities();
        //more code using entity ...
}
1
Scooter

同じコンテキストでコードを実行しても、更新されたエンティティは生成されません。実行の間にデータベースで作成された新しいエンティティのみを追加します。 EF強制リロードは次のように実行できます。

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();
1
CodeMad

私にとって...私はこのように私のDbContextにアクセスします:

_viewModel.Repo.Context

EFにデータベースをヒットさせるには、次のようにします。

_viewModel.Repo.Context = new NewDispatchContext();

現在のDbContextを新しいインスタンスで上書きします。次に、次回データサービスを使用するときに、データベースからデータを取得します。

0
pdschuller