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

Issues connecting to Informix via Entity Framework from Windows

我一直在尝试使用 Entity Framework 从 .Net 应用程序连接到 Informix 数据库,并且在每一步都遇到 运行 无数问题。

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

SQL1159 Initialization error with DB .NET Data Provider, reason code 7

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

Could not load file or assembly 'IBM.Data.DB2, Version=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' or one of its dependencies.

以下是从 64 位计算机连接的 .NET 4.5.1 应用程序的全部内容 运行ning Windows 7.

从 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 Initialization error with DB .NET Data Provider, reason code 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: Could not load file or assembly 'IBM.Data.DB2, Version=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' or one of its dependencies.

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

C:\程序Files\ibm\IBM数据服务器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: Could not load file or assembly 'IBM.Data.DB2, Version=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' or one of its dependencies.

这意味着框架正在尝试使用 32 位 DLL。您可以明确告诉 Visual Studio 到 运行 作为 x64 或 转到 Visual Studio 中的项目属性并确保 'Prefer 32-bit' 在构建选项卡。

.dbo 前缀的问题:

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema($"'{<DatabaseOwner>}'");

    ...
}

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

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

Could not load file or assembly 'IBM.Data.DB2, Version=9.7.4.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208' or one of its dependencies.

嗯,我调整了我的 .NET 项目 - 将其设置为仅 32 位。现在可以了。显然我的 IBM DB2 驱动程序只有 32 位,无法加载 64 位。