2010-09-14 46 views
1

我有一個奇怪的緩存問題,我相信它可能與我使用實體數據模型作爲我的數據源的事實有關。使用實體數據模型的.NET/MVC2數據緩存

問題是,我可以直接更新數據庫,它不反映在實際的網站上,直到我重新發布項目。在本地查看項目時,數據會正確顯示。

奇怪的是,它只是在前端不正確。如果我通過CMS查看記錄,它會正確顯示。

一些源代碼:

// *** CMS CONTROLLER *** 
[HandleError] 
public class SiteManagerController : Controller 
{ 
    static DataModel DB = new DataModel(); 
    // via CMS Controller  
    // CMS - Get the data *** PULLS DATA CORRECTLY 
     public ActionResult Content() 
     { 
      List<SiteContent> viewData = DB.SiteContents.OrderBy(c => c.Title).ToList(); 
      return View(viewData); 
     } 

    // via CMS Controller 
    // CMS - Update logic 
     [HttpPost] 
     [ValidateInput(false)] 
     public ActionResult ContentEdit(int ID, FormCollection formValues) 
     { 
      SiteContent siteContent = DB.SiteContents.Single(c => c.ID == ID); 
      try 
      { 
       UpdateModel<SiteContent>(siteContent); 
       DB.SaveChanges(); 
       return RedirectToAction("Content"); 
      } 
      catch 
      { 
       throw; 
      } 
     } 
    } 

     // *** HOME CONTROLLER *** 
     [HandleError] 
     public class HomeController : Controller 
     { 
      static DataModel DB = new DataModel(); 
      [System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
      public ActionResult Index(string strSlug) 
      { 
       data = DietCenterDB.SiteContents.Single(c => c.Slug == strSlug); 

       return View(data); 
      } 

     } 

* UPDATE * 似乎有某種與此問題相關的定時延遲。如果我更新CMS /數據庫,15-20分鐘後,所有功能都會正常運行。也許某些與前端數據訪問相關的對象需要超時或過期才能獲取新內容?

* UPDATE#2 * 看來只有varchar/text字段沒有正確更新。如果我更改了一個int字段,它會正確更新並在每個頁面上更改信息。

回答

1

你的'DB'對象在哪裏被實例化,它的範圍是什麼?你不應該試圖在任何地方緩存該對象;爲每個請求創建一個新的請求,並讓它成爲GC'ed。這可能是你的麻煩來源,從這裏的一小段代碼。

+0

更新的原始文章包含更多關於DB對象如何實例化的細節。 – 2010-09-14 12:20:45

+0

啊哈;我想我們在這裏。您不應該將DB對象聲明爲靜態。這不僅會導致您正在經歷的意外緩存,而且所討論的對象也不是線程安全的,並且可能會隨着時間的推移佔用大量資源。 – 2010-09-16 04:38:23

+0

以下是更多信息的鏈接:http://blogs.msdn.com/b/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your- objectcontext.aspx – 2010-09-16 04:38:56