不需要的数据库结果或模型缓存

unwanted caching of db results or model

我有一个控制器操作,我正在执行一些操作(下面的示例)

        public ActionResult Dashboard()
        {
        // Redirect back to login page if not authenticated
        if (!this.HttpContext.User.Identity.IsAuthenticated)
        {
            return this.RedirectToAction(string.Empty, "Account");
        }

        this.ApplicationDbContext = new ApplicationDbContext();
        this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
        var user = this.UserManager.FindById(this.User.Identity.GetUserId());

        MyRitualDashboardData model = new MyRitualDashboardData();
        Member member = db.Members.Single(m => m.AspNetUserId == user.Id);
        model.Gravatar = string.Format("<img src='{0}' class='gravatar img-circle'/>", user.PhotoUrl);
        model.UserMember = member;
        model.UserHomeLocation = member.getUserHomeLocation();
        model.UserActiveMembership = member.getActiveMembership();
        model.UserPastMemberships = member.getExpiredMemberships();
        model.UserPayments = member.getUserPayments();
        model.UserStatistics = member.GetMembershipStatistics();
        if (model.UserActiveMembership != null)
        {
            model.DaysTillMembershipExpiry = member.getActiveMembership().daysTillExpiry();
        }

        return this.View(model);
    }

如果我 运行 此代码并使用其他一些操作对数据库进行一些更改,那么当我刷新我的仪表板时,我对会员个人资料所做的各种更新就可以了。

但是如果我尝试重构我的代码并将上面的代码放入单独的 class 并使用静态方法进行调用,如下所示:

        public ActionResult Dashboard()
    {
        // Redirect back to login page if not authenticated
        if (!this.HttpContext.User.Identity.IsAuthenticated)
        {
            return this.RedirectToAction(string.Empty, "Account");
        }

        this.ApplicationDbContext = new ApplicationDbContext();
        this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
        var user = this.UserManager.FindById(this.User.Identity.GetUserId());

        MyRitualDashboardData model = new MyRitualDashboardData();
        model = MyRitualService.GetModelForMyRitual(user);

        return this.View(model);
    }

并在单独的 class 中有一个方法,如下所示:

        public static MyRitualDashboardData GetModelForMyRitual(ApplicationUser user)
    {
        MyRitualDashboardData model = new MyRitualDashboardData();
        Member member = db.Members.Single(m => m.AspNetUserId == user.Id);
        model.Gravatar = string.Format("<img src='{0}' class='gravatar img-circle'/>", user.PhotoUrl);
        model.UserMember = member;
        model.UserHomeLocation = member.getUserHomeLocation();
        model.UserActiveMembership = member.getActiveMembership();
        model.UserPastMemberships = member.getExpiredMemberships();
        model.UserPayments = member.getUserPayments();
        model.UserStatistics = member.GetMembershipStatistics();
        if (model.UserActiveMembership != null)
        {
            model.DaysTillMembershipExpiry = member.getActiveMembership().daysTillExpiry();
        }

        return model;
    }

然后它正在使用数据库中的缓存数据,我不知道为什么?为什么在操作中调用 inline 的相同代码没问题,但是当从它缓存数据的单独静态函数调用时。

任何线索都会很棒。

谢谢

两个版本都有行

Member member = db.Members.Single(m => m.AspNetUserId == user.Id);

但是因为现在有 2 个不同的 类 它也必须有 2 个不同的 dbs.
第二个是静态的,寿命更长(即永不刷新)。

  • 避免static。 2 类 中的分隔是个好主意,但只是举个例子。
  • 遵循命名标准,以便更容易识别属性。