我有一个在多个客户端站点运行的应用程序。我必须在这些位置支持不同的DBMS(SQL Server,DB2,Oracle)。我正在将应用程序从VC ++ 6.0转换为基于ODBC的数据层到Visual Studio 2012,并且希望使用Entity Framework(数据库优先)。我在示例应用程序中运行时更改数据库提供程序时遇到麻烦。我将app.config中的连接字符串从SQL Server更改为DB2连接字符串,并更改了默认连接工厂。现在,当我运行程序时,我可以连接到数据库(至少没有错误)但是当我迭代linq结果时,我得到了异常:
无法将类型为'IBM.Data.DB2.DB2Connection'的对象强制转换为'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" />
从我的搜索和阅读中看起来我应该能够做到这一点,但我显然错过了一些东西。
答案 0 :(得分:2)
更改连接字符串是不够的。 EDMX文件由三部分组成,一部分是特定于提供者(即连接字符串中的.ssdl引用)。您需要为每个需要支持的数据库使用此部件,并且需要为每个此类数据库提供EF提供程序。问题是EDMX设计者不支持为多个提供者建模。因此,您必须为每个数据库设置单独的EDMX =巨大的双重性,或者您必须手动开始为其他数据库维护SSDL文件(它是XML)。
您应该使用代码优先映射和DbContext API制作一些小概念证明,因为它没有这些障碍 - SSDL是在运行时从连接字符串中指定的代码映射和提供程序生成的。