2

我有一个在多个客户端站点上运行的应用程序。我必须在这些位置(SQL Server、DB2、Oracle)支持不同的 DBMS。我正在将应用程序从具有基于 ODBC 的数据层的 VC++ 6.0 转换为 Visual Studio 2012,并希望使用实体框架(数据库优先)。我在示例应用程序中在运行时更改数据库提供程序时遇到了麻烦。我将 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" />

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

4

1 回答 1

2

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

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

于 2012-09-28T16:45:57.087 回答