2013-07-30 42 views
24

我正在編寫一個工資系統,它將與預先存在的系統集成。原始系統有一個主數據庫,用於管理用戶管理和一些全局配置,低於有多個數據庫在結構上相同,基本上每個數據庫都是一個公司工資單數據庫,所有這些數據庫都綁定到主數據庫,因爲它屬於父級公司擁有許多子公司,每個子公司都有自己的人力資源部使用過濾器根據他們的意見在多個數據庫上使用實體框架

我想知道是,如果有,我可以,主要是基於一個cookie,或者他們希望連接,動態是什麼公司專賣店改變實體的另一種方法,任何方式構架目標數據庫?

下面是一個例子:

在該網站,頁面加載與現有企業用戶具有訪問權限的用戶A登錄,用戶隨後將選擇一個公司,他們在該公司管理權限,他們補充一個員工,在執行該動作之前,asp.net會將連接字符串切換到適當的數據庫,然後添加記錄。

+0

最多,你將最終獲得2種環境中,還是有一些解決方法,但非常少的實際和EF6預計將支持多個數據庫。您可以檢查測試版,在您的應用準備就緒後,EF6將會發布。但是,所有數據庫都是一個組織的一部分,然後將它們與其他外鍵合併爲一個數據庫,並使報告更容易。 –

+1

啊,我看到問題在於,製造第一個工資系統的人非常堅持我們要保持數據庫結構一致,他說,這樣公司會更願意升級到更新的版本,不需要做任何數據庫遷移。 – ChaoticLoki

+0

那麼這是維護噩夢,你將無法通過連接進行交叉數據庫查詢。我不確定EF6,但你可以檢查codeplex。 –

回答

5

EF6更好地支持來自相同上下文的多個數據庫訪問。這裏是EF5的一個片段。 事先管理數據庫初始值設定很重要。 您可能不想觸發任何遷移。 即,使用在此之前

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

,但回答的問題:是的,你可以

var conn = GetSqlConn4DbName(dataSource,dbName); 
var ctx = new MyDbContext(conn,true); 



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 

     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 


public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) { } 
} 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

22

這是非常簡單的。我有:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in  web.config also the name of Entitiframework 
{ 
} 

已經在EDMX文件夾

的自動生成Model.Context.cs連接到多個數據庫在運行時,我創造了另一個構造函數連接字符串作爲參數,如下面在同一個文件模型。 Context.cs

public WMSEntities(string connStringName) 
    : base("name=" + connStringName) 
{ 
} 

現在我添加其他連接字符串中的Web.Config例如

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/> 

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

然後連接到數據庫,當我撥打下面的方法傳遞connetionString名作爲參數

public static List<v_POVendor> GetPOVendorList(string connectionStringName) 
{ 
    using (WMSEntities db = new WMSEntities(connectionStringName)) 
    {    
     vendorList = db.v_POVendor.ToList();     
    } 
} 
+0

嗨,,這看起來不錯....我的查詢是,如果它的任何數據庫模型的變化,它將如何影響。這將是維修噩夢? – niku

+0

什麼是我們重新生成model.cs文件,再次我們必須添加配置公共WMSEntities(字符串connStringName) :base(「name =」+ connStringName) { } –