0

我有一个应用程序,我首先使用实体​​框架代码。我对 EF 实现身份映射模式有疑问,EF 在内存中缓存了一些实体。我想要做的是向用户添加一个 newdesk。因此,当我使用添加了新闻台的用户登录时,他们将能够使用该应用程序。但这似乎不起作用。如果我手动刷新我的 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 回答