0

最初にエンティティフレームワークコードを使用しているアプリケーションがあります。ID マップ パターンを実装する EF に問題があります。EF はいくつかのエンティティをメモリにキャッシュします。私がやりたいことは、新しいデスクをユーザーに追加することです。そのため、ニュースデスクを追加したユーザーでログインすると、アプリケーションを使用できるようになります。しかし、これはうまくいかないようです。localdb を手動で更新すると、ログインできます。

コンテキストを更新しようとしましたが、機能しません。これは私の add newsdesk メソッドのコード スニペットです。役に立つかどうかはわかりませんが、私はグローバルなコンテキストで作業しています。どんな助けにも感謝します。

        var user = DatabaseContext.Users.Single(u => u.Id == userid);
        var newsdesk = DatabaseContext.Newsdesks.Single(u => u.Id == newsdeskid);

        user.Newsdesk = newsdesk;

        DatabaseContext.SaveChanges();
        DatabaseContext.Reload(user);
        var objContext = ((IObjectContextAdapter)DatabaseContext).ObjectContext;
        objContext.Refresh(RefreshMode.StoreWins, user);
4

1 に答える 1

1

あなたが示したコードに基づいて、DatabaseContext静的として使用するのでDatabaseContext、シングルトンとして使用していると思いますよね?

コードの問題は、予想よりも長い寿命を維持していることですDbContext。あなたの場合、それはアプリケーションの有効期間として生きており、問題につながるでしょう:

  1. 問題が発生しました。内部キャッシュのデータが古いため、手動で更新する必要があります。
  2. とりあえず内部キャッシュが増えてしまい、最終的にメモリリークの原因となります。

使用するベスト プラクティスは次のDbContextとおりです。

  1. Web アプリケーションでは、存続期間DbContextを要求ごとに維持します。
  2. win アプリケーションでは、存続期間DbContextをスレッドごとに維持します。

IoC コンテナーを使用して、これを機能させることができます。

于 2013-03-06T14:58:03.683 に答える