18

我对 NHibernate 非常陌生,所以如果我在这里遗漏了一些琐碎的事情,我深表歉意。我目前正在阅读 packtpub 的一本名为“NHibernate 3 Beginners Guide”的书。我主要是按照书中的指示进行的。当我说的主要是我使用 MySQL 而不是 MSSQL 并一直使用 NuGet 而不是手动下载二进制文件时,我已经分歧了。

我现在在第 2 章,这是第一个真正的编码章节。在本章中,我将构建一个简单的 WPF 应用程序,通过单击按钮来构建我的数据库架构。我已经为本章中指定的Product和类构建了一些 POCO。Category通过 NuGet,我添加了以下参考:

  1. MySQL.数据
  2. NHibernate(作为自动解析的依赖项,Iesi.Collections)
  3. 流畅的 NHibernate

当我单击按钮来构建我的数据库时,将执行以下代码块:

private const string connString = "string omitted for brevity";

private void btnCreateDatabase_Click(object sender, RoutedEventArgs e)
    {
        Fluently.Configure().Database(MySQLConfiguration.Standard.ConnectionString(connString))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProductMap>())
            .ExposeConfiguration(CreateSchema)
            .BuildConfiguration();
    }

单击按钮后,我收到以下异常(FileLoadException):

外部异常消息:Could not load file or assembly 'Iesi.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

内部异常消息:Could not load file or assembly 'Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

如果有帮助,这里是“Fusion Log”:

=== Pre-bind state information ===
LOG: User = Borealis\Frito
LOG: DisplayName = Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
 (Fully-specified)
LOG: Appbase = file:///C:/Users/Frito/documents/visual studio 2010/Projects/NH3BeginnersGuide/Chapter2/App/Sample.UI/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Users\Frito\documents\visual studio 2010\Projects\NH3BeginnersGuide\Chapter2\App\Sample.UI\bin\Debug\Sample.UI.vshost.exe.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Redirect found in application configuration file: 1.0.1.0 redirected to 4.0.0.0.
LOG: Post-policy reference: Iesi.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
LOG: Attempting download of new URL file:///C:/Users/Frito/documents/visual studio 2010/Projects/NH3BeginnersGuide/Chapter2/App/Sample.UI/bin/Debug/Iesi.Collections.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

我尝试了以下方法,现在有点不知所措:

  1. 尝试通过 NuGet 升级 Iesi.Collections 但未能说明没有兼容的 NHibernate 版本。
  2. 下载 NHibernate 和 FluentNhibernate 的二进制文件并手动引用它们。
  3. 从书中提取源示例并复制示例中的 DLL。这给了我一个不同的错误,我还没有深入研究以提出问题。

我有两个问题:

  1. 首先,为什么 NuGet 包会在发布的版本指向 1.* 时尝试查找版本 4.* dll?
  2. 除了获取所有源代码并在本地构建之外,我还应该尝试哪些其他事情?我有点茫然,会喜欢其他一些输入。

提前致谢!

4

2 回答 2

35

天哪,这让我发疯了。我发现 anapp.config是在某个时候创建​​的,大概是因为我在弄乱某些东西。在app.config我发现以下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Iesi.Collections" publicKeyToken="aa95f207798dfdb4" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

注释掉Runtime元素,重建和运行允许上面的按钮正常工作。我不确定我做了什么导致它生成,但我很高兴我找到了它。感谢大家的努力,感谢您对这个问题的支持!

于 2012-11-11T15:52:36.247 回答
16

Iesi.Collections 4.0 是一个针对 .Net 4.0 的经过大量修改的版本,用于未来的 NHibernate 4.0。

不幸的是,用于 NHibernate 版本(包括 3.3.1)的 Nuget 包没有指定 Iesi 依赖项的上限。NHibernate 3.3.2 对此进行了更改,明确禁止 Iesi 版本 4 或更高版本。因此,如果您通过 NuGet 更新到 NH 3.3.2,我希望它能够将 Iesi 依赖关系解析为 3.x 版本。

于 2012-11-11T17:49:56.367 回答