2013-10-23 88 views
0

我有EF5的問題。我正在使用MVC 4.5實體框架5與存儲庫檢索舊數據

我試圖使每個請求「模式」1上下文。

我沒有使用「工作單元」模式,也沒有使用測試或DI。

我正在使用通用存儲庫模式與數據庫進行交互。每個存儲庫使用單身「DataContextManager」所使用的相同上下文。

在全局asax中的每個請求中,我刷新了上下文,但是發生了一些錯誤:ie:如果我在DB中更改了數據,我有一個分頁列表並移動頁面,因此它無法正確刷新。 這不是一個HTML緩存問題,我測試了它。

我知道是EF上下文的問題,因爲我有「這樣的事情」:

private static Context C; //for the singleton. And in global.asax 

public Application_BeginRequest() 
{  
    DataContextManager.RefreshNew(); 
} 

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    Domain.DataContextManager.Dispose(); 
} 

並在第一時間名單的工作,並在第二頁我得到一個錯誤說, 上下文是處置。

我讀了一些在靜態變量中使用上下文的東西,但我不知道發生了什麼。我想使用這樣簡單的東西,因爲要實現UnitOfWork模式,我需要更改很多代碼。

這裏是我的課的一點snnipet:

public class DataContextManager 
    { 
     private static Entities _Context; 

     private const string ConnectionString = "connString"; 

     public static Entities Context 
     { 
      get 
      { 
       if (DataContextManager._Context == null) 
        DataContextManager._Context = new Entities(ConfigurationManager.ConnectionStrings[ConnectionString].ConnectionString); 

       return DataContextManager._Context; 
      } 
     } 

     //This method is not necessary but made it for testing 
     public static void RefreshNew() 
     {     
      DataContextManager._Context = new Entities(ConfigurationManager.ConnectionStrings[ConnectionString].ConnectionString); 
     } 

     public static void Dispose() 
     { 
      if (DataContextManager._Context != null) 
      { 
       DataContextManager._Context.Dispose(); 
       DataContextManager._Context = null; 
      } 
     } 
    } 

和存儲庫使用DataContextManager這樣的:提前

public class BaseRepository<TEntity> where TEntity : class 
    { 
     internal Entities context; 
     internal DbSet<TEntity> dbSet; 

     public BaseRepository() 
      : this(DataContextManager.Context) 
     { 
     } 

     public BaseRepository(Entities context) 
     { 
      this.context = context; 
      this.dbSet = context.Set<TEntity>(); 
     } 

謝謝!

Pablo。

回答

0

我不知道你真的需要經理級,因爲一切似乎只是訪問DbContext屬性。

這就是說,你通常應該避免在靜態類中使用DbContext;我沒有任何規範的來源來支持它,但我個人的經驗是,它在某些時候會導致比靜態類提供的任何好處更多的問題。所以,我會更新管理器,像這樣:

public class DataContextManager 
{ 
    private readonly string connectionToUse = string.Empty; 

    private Entities _context; 

    public Entities Context 
    { 
     get 
     { 
      if (_context == null) 
      { 
       _context = new Entities(WebConfigurationManager.ConnectionStrings[connectionToUse].ConnectionString); 
      } 

      return _context; 
     } 
    } 

    public DataContextManager() 
    { 
     connectionToUse = "connString"; 
    } 

    public DataContextManager(string key) 
    { 
     connectionToUse = key; 
    } 


    #region IDisposable Members 

    public void Dispose() 
    { 
     this.Dispose(true); 

     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposeAll) 
    { 
     if (disposeAll) 
     { 
      _context.Dispose(); 
     } 
     _context = null; 
    } 

    #endregion 
} 

然後你只是一個受保護字段添加到您的每個控制器和實例化管理器在控制器的構造函數:

protected DataContextManager Manager = null; 

public HomeController() 
{ 
    Manager = new DataContextManager(); 

    // or 
    // 
    //__manager = new DataContextManager("connection-To-Use"); 
} 

如果您的所有控制器使用相同的DbContext類,則可以創建BaseController類,該類繼承System.Web.Mvc.Controller並將管理器移入其中,這樣可以節省一些重複。