我有一个在多个客户端站点上运行的应用程序。我必须在不同的位置支持不同的 DBMS(SQL Server、DB2、Oracle)。我正在将应用程序从具有基于 ODBC 的数据层的 VC++ 6.0 转换为 Visual Studio 2012,并希望使用 Entity Framework (首先是数据库)。我在示例应用程序运行时更改数据库提供程序时遇到问题。我将 app.config 中的连接字符串从 SQL Server 连接字符串更改为 DB2 连接字符串,并更改了默认连接工厂。现在,当我运行程序时,我可以连接到数据库(至少没有错误),但是当我迭代 linq 结果时,我得到了异常:
Unable to cast object of type 'IBM.Data.DB2.DB2Connection' to type 'System.Data.SqlClient.SqlConnection'
程序代码如下:
private void btnList_Click(object sender, EventArgs e)
{
using (var ListBill = new LB402_TestEntities())
{
var queryGroups = from Groups in ListBill.LB_Group
select Groups.GroupName;
foreach (string name in queryGroups)
{
lbGroups.Items.Add(name);
}
}
}
app.config 的修改部分是:
<defaultConnectionFactory type="IBM.Data.DB2.Entity.DB2ConnectionFactory, EntityFramework" />
<add name="LB402_TestEntities" connectionString="metadata=res://*/LB402.csdl|res://*/LB402.ssdl|res://*/LB402.msl;provider=IBM.Data.DB2;provider connection string="Server=db210:50000;Database=LISTBILL;uid=uuuuu;pwd=ppppp;"" providerName="System.Data.EntityClient" />
从我的搜索和阅读来看,我似乎应该能够做到这一点,但我显然错过了一些东西。
最佳答案
仅更改连接字符串是不够的。 EDMX 文件由三部分组成,其中一部分是特定于提供商的(即来自连接字符串的 .ssdl 引用)。您需要为每个需要支持的数据库提供此部分,并且您需要为每个此类数据库提供 EF 提供程序。问题是 EDMX 设计器不支持多个提供商的建模。因此,您必须要么为每个数据库拥有单独的 EDMX = 巨大的口是心非,要么必须开始手动维护其他数据库的 SSDL 文件(它是 XML)。
您应该使用代码优先映射和 DbContext API 进行一些小型概念验证,因为它没有这些障碍 - SSDL 是在运行时根据连接字符串中指定的代码映射和提供程序生成的。
关于entity-framework-5 - Entity Framework 5 在运行时更改提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641781/