2013-02-15 82 views
1

我正在開發這個應用程序,我必須從多個架構(定義在運行時)從多個表(所有具有相同的結構)讀取數據。 使用實體框架5與代碼優先的方法,我需要一種方法來更改實體的模式名稱。 此刻我正在使用帶有兩個參數的構造函數創建我的DbContext,DbConnection和模式名稱(我在重寫的OnModelCreating中使用女巫)。EF5 CodeFirst架構名稱

第一次創建DbContext時,一切正常,我能夠獲取數據。但是當我使用第二個模式名稱創建一個新的DbContext時,DbContext使用的DbConnection是在構造器中傳遞的,但實體中的模式名稱仍然是第一個,因爲OnModelCreating不會被調用,即使我正在創建一個DbContext的新實例。

任何意識? 謝謝

編輯:不要認爲它很重要,但我使用的是Oracle數據庫。

+0

爲什麼不能創建2個獨立的DBContexts或將兩種模式在同一個文件? – 2013-02-15 08:38:23

+0

連接到的模式在運行時定義。 – Kamolas81 2013-02-15 09:35:51

回答

0

您可以通過爲每個架構(使用默認架構集)和多個連接字符串創建SQL Server用戶來完成此操作。

在您的應用程序中,爲每個用戶(模式)創建一個連接字符串。添加一個接受連接字符串的dbcontext構造函數,然後將適當的連接字符串傳遞給構造函數。

+0

這實際上就是我所擁有的:)問題是我必須在實體或EF的映射中提供模式名稱,同時假設dbo。作爲模式。 – Kamolas81 2013-02-15 09:39:32

+0

oopps對不起。錯誤的問題。看看你現在的意思。不知道我頭頂的答案。 – 2013-02-15 09:45:23

+1

你見過這個 - http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/ - 我只掃描它,但它似乎做你想做的。 – 2013-02-15 09:49:45

0

您可能能夠通過提供自定義數據庫初始化做一些事情(IDatabaseInitializer和Database.SetInitializer(新YouCustomInitializer());)

+0

據我所知,IDatabaseInitializer用於創建數據庫,對吧?我正在使用現有的數據庫 – Kamolas81 2013-02-15 09:53:44

+0

我相信IDatabaseInitializer每次你的上下文被初始化時都會被調用。您現在可以做一些工作來重新創建不同的模式? – 2013-02-15 10:17:46