我正在开发一个应用程序,其中数据库由最终用户在运行时选择。数据库既可以位于MS服务器上,也可以位于上。我目前正在windows服务器上使用IBM10Express-c进行测试。我正在使用Visual 2013 C#和EntityFramework6进行开发,我已经为DB2支持安装了EntityFramework.IBM.DB2 Nuget包。我正在使用反向工程代码-首先针对现有的SQL server数据库生成我的基本代码。该应用程序对Server数据库运行良好。
我使用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是provider=IBM.Data.DB2;provider connection string="Database=LISTBILL;User ID=xxxx;Password=yyyy;Server=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里面。
只需将connect字符串更改为指向server即可,因此我认为我的基本方法是正确的。如果我从服务器得到某种错误,我就会有一些事情要做。我可以在Visual内部运行查询,所以我有连接性。
如有任何指示,将不胜感激。
更新:i发现EF对象是使用EF5生成的,使用的是EF6运行时。我首先使用EF6反向工程代码重新生成EF对象。现在我可以连接到数据库并获得一条错误消息:"ERROR 42704DB2/ is 64 SQL0204N \"DBO.LB_SYSTEM\“是一个未定义的名称。”DB2数据库中的模式与我的userid相同(在本例中,并非总是如此)。我将CurrentSchema=xxxx添加到provide字符串中,但EF仍然将dbo作为模式名传递。
现在,我需要一种在运行时更改架构名称的方法。我看到了到codeplex EFModelAdapter (http://efmodeladapter.codeplex.com)的链接。所以我可以试一试。
Update2在浏览了EFModelAdapter之后,决定选择另一条路线。由于我只需要数据库访问而不需要模式管理,所以我决定使用Dapper (https://github.com/StackExchange/dapper-dot-net)。这对于我需要的内容非常有用,并且允许我在访问DB2数据库时更改模式名称。
发布于 2015-07-01 15:12:42
根据我的更新2,实体框架对我所需要的有点过分了。我切换到了dapper https://github.com/StackExchange/dapper-dot-net,并且对多个DBMS进行了很好的工作。
https://stackoverflow.com/questions/30956532
复制相似问题