从 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的生命周期