实体框架5在运行时更改提供程序

时间:2012-09-28 14:16:15

标签: entity-framework-5

我有一个在多个客户端站点运行的应用程序。我必须在这些位置支持不同的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=&quot;Server=db210:50000;Database=LISTBILL;uid=uuuuu;pwd=ppppp;&quot;" providerName="System.Data.EntityClient" />

从我的搜索和阅读中看起来我应该能够做到这一点,但我显然错过了一些东西。

1 个答案:

答案 0 :(得分:2)

更改连接字符串是不够的。 EDMX文件由三部分组成,一部分是特定于提供者(即连接字符串中的.ssdl引用)。您需要为每个需要支持的数据库使用此部件,并且需要为每个此类数据库提供EF提供程序。问题是EDMX设计者不支持为多个提供者建模。因此,您必须为每个数据库设置单独的EDMX =巨大的双重性,或者您必须手动开始为其他数据库维护SSDL文件(它是XML)。

您应该使用代码优先映射和DbContext API制作一些小概念证明,因为它没有这些障碍 - SSDL是在运行时从连接字符串中指定的代码映射和提供程序生成的。