5

DbContext / CodeFirstを使用してwinformsアプリケーション内にEntityFrameworkを実装しており、エンティティが別のコンテキストで削除/更新された場合のチェック/処理の適切な方法について、次の質問があります。

たとえば、いくつかの補助テーブルデータ(StateCodesなど)があり、ユーザーは別のデータに移動して、必要に応じて状態を追加/削除できます。この補助エディターフォームは、独自のDbContextを利用し、ユーザーがフォームを終了すると変更を保存します。メインフォームに戻ると、メインコンテキストはデータベースに加えられた変更を認識しないため、エンティティのDbSetをリロードします。残念ながら、「MI」状態コードを削除すると、「Load」を呼び出してすべてを取り込んだ後でも、EntityStateが変更されていないDbSetのLocalプロパティにまだ存在しているようです。

メインコンテキストを完全に破棄する以外に、データベースから削除されたエンティティを確認するための最良の方法は次のとおりですか?

foreach (State state in db.States.Local)
{
    DbEntityEntry entry = db.Entry(state);
    DbPropertyValues databaseValues = entry.GetDatabaseValues();
    if (databaseValues == null)
    {
        db.States.Remove(state);
    }
    else
    {
        entry.OriginalValues.SetValues(databaseValues);
    }
}

ご協力ありがとうございました

4

2 に答える 2

3

作業単位を超えてコンテキストをライブに保つべきではありません。コンテキストは必要な期間だけ存続する必要があります。そうしないと、観察しているように、キャッシングの落とし穴にぶつかることになります。(また、コンテキストは実際にはそれほど重くはなく必要なときにインスタンス化するのは非常に時間とリソースを消費します)。

本当にそれを存続させなければならない場合は、コンテキストを補助フォームに渡すことを検討することをお勧めします。

私のコメントからミラーリングされて、それが答えとして役立つのが最善であると考えました

于 2012-12-20T16:44:52.220 に答える
0

まず、ブラッドが言ったこと。特定の作業単位のコンテキストのみを存続させ、破棄します。これを行わないと、頭痛の種になります。

ObjectStateManagerを使用してエンティティの状態を確認し、オブジェクトまたはエンティティキーを渡すこともできます。また、使用することができます

public void Refresh( RefreshMode refreshMode, IEnumerable collection )

コンテキストからのメソッド。また、エントリー状態を確認することもできます。

http://msdn.microsoft.com/en-us/library/bb503718.aspx

于 2012-12-20T16:51:05.743 に答える