2017-04-01 87 views
0

我一直在ApplicationDbContext構造函數中使用Session值。但在我的大型應用程序中,我使用了在後臺運行的Threading。當Threading方法命中ApplicationDbContext構造函數時,它不會獲得會話值,因爲請求已經完成。我得到空引用異常,所以應用程序崩潰。C#MVC處理ApplicationDbContext中的空值構造函數參數

以下是ApplicationDbContext構造函數代碼: -

public ApplicationDbContext(string schemaname, string connString = "") 
      : base(connString) 
     { 
      SchemaName = schemaname; 
      ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180; 
     } 

     public ApplicationDbContext(string schemaname) 
      : this(schemaname, System.Web.HttpContext.Current.Session["ConnStringName"].ToString()) 
     { 
     } 

如何處理空會話在上面的構造?

回答

0
public ApplicationDbContext(string schemaname, string connString = "") 
      : base(connString ?? whateverDefaultConnStringName) 
     { 
      SchemaName = schemaname; 
      ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180; 
     } 

    public ApplicationDbContext(string schemaname) 
      : this(schemaname, System.Web.HttpContext?.Current?.Session?["ConnStringName"].ToString()) 
     { 
     } 
+0

此代碼給出語法錯誤。 – Anup

+0

@Anup如果你使用C#版本6或更高 - 這應該編譯:「System.Web.HttpContext.Current?.Session?[」ConnStringName「] ?. ToString()」 – Evk

+0

謝謝@Evk。 – HGMamaci

0

這就是窮人的抽象,如果你正在使用的MVC /網頁API不把相關的HTTP上下文東西在DbContext尤其是HttpContext.Current的構造。

你應該做的是使用IoC(DI)框架,如AutoFac。創建一個具有HttpContextBase注入構造函數的執行上下文類型(具有匹配的接口),然後從Session中提取要使用的連接字符串。註冊您的DbContext類型以將您的Execution類型注入到其構造函數中,並從中初始化連接字符串。這將爲您提供良好的SoC(關注點分離),代碼不再依賴於執行的線程上下文,並且允許更簡單的單元測試。

有很多關於如何設置IoC與MVC和許多IoC框架可供選擇的教程。