db结果或模型的不需要的缓存

时间:2015-03-29 00:20:20

标签: c# asp.net-mvc asp.net-mvc-4 caching

我有一个控制器动作,我正在执行一些工作(例如下面)

        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);
    }

如果我运行此代码并使用其他一些操作对数据库执行某些更改,那么当我刷新仪表板时,我对成员配置文件所做的各种更新都没问题。

但是,如果我尝试重新考虑我的代码并将上面的代码放入一个单独的类中,并使用静态方法来执行这样的调用:

        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);
    }

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

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

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

任何线索都会很棒。

由于

1 个答案:

答案 0 :(得分:1)

两个版本都有行

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

但由于现在它在2个不同的类中,因此它必须是2个不同的db s 第二个是静态的,会活得更长(即永不刷新)。

  • 避免使用static。两个类中的分离是一个好主意,但只是创建实例。
  • 遵循命名标准,以便更容易识别属性。