簡體   English   中英

初始化並將數據庫名稱作為參數傳遞給具有整個類范圍的DbContext對象

[英]Initialize and pass database name as parameter to DbContext object having scope of whole class

我正在使用EF 6開發多租戶MVC 5應用程序。對於每個用戶,我都覆蓋了Entities構造函數以獲取數據庫名稱作為參數。 我已經將數據庫名稱存儲在針對所有用戶維護的另一個代碼優先數據庫中。 用戶登錄時,其數據庫名稱將加載到會話中,然后它將傳遞給Entities構造函數。 一切都很好,但這是問題所在,

我想在控制器中聲明具有類范圍的Entities對象。 現在:

  1. 會話只能在方法(ActionResult)內部訪問,因此不能在類范圍內使用。
  2. 不能使用靜態變量。
  3. 如果我在所有使用Entites的ActionResults中初始化實體對象,則該應用程序可以正常工作,但我不想一次又一次地初始化對象。
  4. Web.config文件中沒有維護任何連接字符串,對於作為參數傳遞的數據庫名稱,在代碼內部生成了ConnectionString,因此我無法使用ConfigurationManager類。

我想做的是:

public class ABCController : BaseController //BaseController has all Sessions
{
    private MyEntities db = new MyEntities("dbName"); //dbName is a session
    // all code and ActionResults here
}

我該怎么做?

如果我在所有使用Entites的ActionResults中初始化實體對象,則該應用程序可以正常工作,但我不想一次又一次地初始化對象。

為什么不? 那正是你應該做的。

即使它是類級別的成員,控制器實例也不會在請求中持久存在。 因此,無論如何,用戶都會為每個請求實例化它。 所有這些方法所做的就是將實例化移動到使用戶上下文可用之前。

每當用戶向應用程序發出請求時,您就擁有該用戶的上下文。 (在這種情況下,來自會話。)該上下文包括數據庫連接的密鑰。 因此,只要用戶發出請求,就可以使用該密鑰創建數據庫連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM