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


91

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

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

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


2
29kビューとこれに対するわずか19の賛成...まあ、とにかく私は私のものを追加しました
jleach 2017

回答:


152

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

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

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


ありがとうございました!1つではなくエンティティのコレクションをリロードする方法はありますか?できれば全体DbSet
サラバナ2014年

これが答えと見なされるために必要なものは他にありますか?
PlTaylor 2014年

1
はい、それでもエンティティのコレクションをリロードする方法は示されていません。
サラバナ2014年

1
dbcontextを破棄して、新しいものを作成しようとしましたか?
PlTaylor 2014年

3
この結論に達するのに何時間もかかりました。答えのその編集は私が私の解決策を見つけるのを助けたものです。ありがとう!
BeemerGuy 2017年

17

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

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

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


遅延読み込みを機能させるために、どこにデタッチ状態を適用しますか?私はあなたの解決策を試しましたが、それは私にはうまくいきませんでした、私は何かを逃したに違いありません。あなたの助けをいただければ
レックス

2
私はそれを理解しました:1。エンティティを保存します。2。状態を分離に設定します。3。データベースからエンティティを読み取ります。ヒントをありがとう!
レックス

1

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

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

1

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

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 ...
}

0

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

_viewModel.Repo.Context

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

_viewModel.Repo.Context = new NewDispatchContext();

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.