2015-06-20 32 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数据库时更改模式名称。

回答