从 Windows 通过 Entity Framework 连接到 Informix 的问题

Posted

技术标签:

【中文标题】从 Windows 通过 Entity Framework 连接到 Informix 的问题【英文标题】:Issues connecting to Informix via Entity Framework from Windows 【发布时间】:2016-04-01 06:40:09 【问题描述】:

我一直在尝试使用 .Net 应用程序中的实体框架连接到 Informix 数据库,并且在每一步都遇到了许多问题。

尝试使用 testconn40 命令测试与数据库的连接,我得到以下信息:

SQL1159 使用 DB .NET 数据提供程序初始化错误,原因代码 7

尝试从我的 .Net 应用程序连接时出现以下异常:

无法加载文件或程序集“IBM.Data.DB2,版本=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' 或其其中之一 依赖关系。

【问题讨论】:

【参考方案1】:

以下内容适用于从运行 Windows 7 的 64 位计算机连接的 .NET 4.5.1 应用程序。

从 Windows 连接:

首先安装 IBM 数据服务器驱动程序包(DS 驱动程序):http://www-01.ibm.com/support/docview.wss?uid=swg21385217

使用新名称通过命令行安装 10.5.5 补丁:

v10.5fp5_ntx64_dsdriver_EN.exe -n "IBMDBCL2"

在安装过程中设置为默认值,如果未能设置为默认值,则手动更新系统路径以指向第二个安装位置。就我而言:C:\Program Files\ibm\IBM DATA SERVER DRIVER_01\bin

尝试从命令行运行以下命令:

testconn40 "Database=<dbname>"; Server=<IP>:<Port>; User ID=<User>; Password=<Password>;"

如果您收到类似以下的错误:

SQL1159 使用 DB .NET 数据提供程序初始化错误,原因代码 7

打开 regedit.exe 并导航到:HKEY_LOCAL_MACHINE\SOFTWARE\IBM\DB2\InstalledCopies\ 并确保有 IBMDBCL1 和 IBMDBCL2 的文件夹。如果您缺少 IBMDBCL2,则说明安装出现问题,因此您必须重新开始。

在 InstalledCopies 文件夹中,确保有 10.5.5.DEF.4 的条目指向 IBMDBCL2。如果没有就加一个。 testconn40 命令现在应该可以通过了。

使用 EntityFramework.IBM.DB2 包从 .Net 应用程序连接:

正常安装包等,然后尝试运行应用程序。如果遇到以下异常:

FileNotFoundException:无法加载文件或程序集 'IBM.Data.DB2, 版本=9.7.4.4,文化=中性,PublicKeyToken=7c307b91aa13d208' 或 它的依赖项之一。

您可能缺少 GAC 的程序集。所以去驱动安装的地方:

C:\Program Files\ibm\IBM DATA SERVER DRIVER_01\bin\netf40

并在命令行上运行以下命令:

gacutil /i IBM.DATA.DB2.dll
gacutil /i IBM.DATA.informix.dll
gacutil /i IBM.DATA.DB2.entity.dll

然后您应该能够在以下位置看到程序集:C:\Windows\Microsoft.NET\assembly\GAC_64\

如果你得到:

BadImageFormatException:无法加载文件或程序集 'IBM.Data.DB2,版本=9.7.4.4,文化=中性, PublicKeyToken=7c307b91aa13d208' 或其依赖项之一。

这意味着框架正在尝试使用 32 位 DLL。您可以明确告诉 Visual Studio 以 x64 方式运行,或者转到 Visual Studio 中的项目属性,并确保未选中“构建”选项卡下的“首选 32 位”。

.dbo 前缀的问题:

我遇到的最后一个问题是 Entity Framework 自动添加 dbo. 作为所有表名的前缀。 Informix 期望前缀是表的所有者(在我的例子中,用户帐户用于创建表)。在 Server Studio 中,您可以在表属性的常规选项卡上看到所有者。

我能够通过将以下代码行添加到我的上下文类来解决(注意单引号):

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.HasDefaultSchema($"'<DatabaseOwner>'");

    ...

希望这可以帮助其他尝试通过 Entity Framework 连接到 Informix 的人。

【讨论】:

【参考方案2】:

几个星期以来,我都遇到了同样的问题和 OP -

无法加载文件或程序集“IBM.Data.DB2,版本=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' 或其其中之一 依赖关系。

好吧,我调整了我的 .NET 项目 - 将其设置为仅 32 位。现在它起作用了。显然我的 IBM DB2 驱动程序只有 32 位,并且无法加载 64 位。

【讨论】:

以上是关于从 Windows 通过 Entity Framework 连接到 Informix 的问题的主要内容,如果未能解决你的问题,请参考以下文章

csharp http://root-project.org/work/net/why-you-shouldnt-use-entity-framework-with-transactions/

如何通过 Windows Azure(预览版)管理门户设置 ADO.NET Entity Framework 连接字符串?

从源代码分析DbSet如何通过ObjectStateManager管理entity lifecycle的生命周期

apache 上的 X-Frame-Options

背水一战 Windows 10 (41) - 控件(导航类): Frame

背水一战 Windows 10 (42) - 控件(导航类): Frame 动画