entity-framework-5 - Entity Framework 5 在运行时更改提供程序

标签 entity-framework-5

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

相关文章:

asp.net-mvc-4 - MVC "create view"当模型中存在一对多关系时

asp.net-mvc-4 - MVC 4 应用程序、EF 和 Web API 结构以及用户身份验证

.net - EF 4.3.1和EF 5.0 DbSet.Local比实际的数据库查询要慢

c# - 无法确定存储版本 - Entity Framework

c# - 如何使用模型优先方法使用动态连接字符串但仍使用 EDMX 中的数据模型?

c# - "Unable to create a constant value of type [MyClass]. Only primitive types are supported in this context."

c# - TransactionScope 而不是使用锁

entity-framework - InvalidOperationException(集合已设置为 EntityCollection)在模板修改后所有属性都是虚拟的

c# - EntityType 'DbGeography' 没有定义键

c# - 在 EF 中调用用户定义的函数 - 我做错了什么?