2015-06-20 69 views
1

我正在開發一個應用程序,其中數據庫在運行時由最終用戶選擇。數據庫可以位於MS SQL服務器或IBM DB2服務器上。我目前在Windows服務器上使用IBM DB2 10 Express-c進行測試。我正在開發使用Visual Studio 2013 C#和實體框架6.我已經安裝了DB2支持的EntityFramework.IBM.DB2 Nuget包。我正在使用反向工程代碼 - 首先針對現有的SQL服務器數據庫生成我的基本代碼。該應用程序對SQL Server數據庫工作正常。使用實體框架6訪問DB2-LUW 10

我正在使用System.Data.Common.DbProviderFactories.GetFactory生成提供程序。

  System.Data.EntityClient.EntityConnectionStringBuilder connectString = new System.Data.EntityClient.EntityConnectionStringBuilder(a_Connection); 
      System.Data.Common.DbConnection conn = System.Data.Common.DbProviderFactories.GetFactory(connectString.Provider).CreateConnection(); 
      conn.ConnectionString = connectString.ProviderConnectionString; 
      LB500Database = new LB402_TestContext(conn, true); 

a_Connection是提供商=的IBM.Data.DB2;提供商連接字符串= 「數據庫= LISTBILL;用戶ID = XXXX;密碼= YYYY;服務器= db210:50000」 和正在由EntityConnectionStringBuilder正確解析。

然後我嘗試訪問數據庫中的表與

  LBData500.LB_System oneSystem; 
      System.Linq.IQueryable<LB_System> allSystem = LB500Database.LB_System.Where(g => g.DatabaseVersion == databaseVersion && g.CompanyID == companyID); 

我得到一個無效的操作異常「序列中沒有匹配的元素」,這意味着沒有元素被返回。如果我刪除了Where,以便返回所有行(表中有一個),並嘗試使用VS調試器來枚舉結果集,我會看到以下消息: 「在創建模型時無法使用上下文。如果在OnModelCreating方法中使用上下文,或者同時由多個線程同時訪問同一個上下文實例,則可能會拋出異常。請注意,DbContext和相關類的實例成員不保證是線程安全的。

我沒有使用多線程。我不在OnModelCreating裏面。

只是改變連接字符串指向SQL服務器工作正常,所以我認爲我的基本方法是健全的。如果我從服務器收到某種錯誤,我會繼續下去。我可以在Visual Studio中運行查詢,所以我具有連接性。

任何指針,將不勝感激。

更新: 我證明EF對象是使用EF5生成的,並且正在使用EF6運行時。我首先使用EF6反向工程代碼重新生成EF對象。我現在可以連接到數據庫並收到錯誤消息: 「ERROR [42704] [IBM] [DB2/NT64] SQL0204N \」DBO.LB_SYSTEM \「是一個未定義的名稱。」 DB2數據庫中的模式與我的用戶ID相同(在這種情況下並不總是)。我將CurrentSchema = xxxx添加到提供的連接字符串,但EF仍將dbo作爲模式名稱。

現在我需要一種方法來在運行時更改模式名稱。我看到了一個codeplex EFModelAdapter(http://efmodeladapter.codeplex.com)的鏈接。所以我可以試試。

Update2通過EFModelAdapter查看後,我決定採取不同的路線。由於我只需要數據庫訪問而不需要模式管理,因此我決定和Dapper一起(https://github.com/StackExchange/dapper-dot-net)。這對我所需要的很有用,並允許我在訪問DB2數據庫時更改模式名稱。

回答