使用Fluent NHibernate + SQLite与.NET 4的问题?

时间:2010-04-23 10:28:42

标签: .net sqlite fluent-nhibernate .net-4.0

我有一个运行VS2010 .Net3.5的WPF应用程序使用Nhibernate和FluentNHibernate + SQLite,一切正常。

现在我想改为使用.Net4,但这已经变成了一种比我想象的更痛苦的经历..在设置连接时我这样做:

var cfg = Fluently.Configure().
    Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("MyDb.db")).
    Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();                    

BuildSessionFactory()调用抛出FluentConfigurationException:

  

创建SessionFactory时使用了无效或不完整的配置。检查PotentialReasons集合和InnerException以获取更多详细信息。

内部异常为我们提供了更多信息:

  

无法从NHibernate.Driver.SQLite20Driver,NHibernate,Version = 2.1.2.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4。

创建驱动程序。

进一步的InnerException:

  

找不到程序集System.Data.SQLite中的IDbCommand和IDbConnection实现。确保程序集System.Data.SQLite位于应用程序目录或全局程序集缓存中。如果程序集位于GAC中,请使用应用程序配置文件中的元素指定程序集的全名。

现在 - 对我来说听起来好像找不到System.Data.SQLite.dll,但我无法理解这一点。引用的所有地方我都有“复制本地”,我已经验证它是在使用SQLite的项目的每个构建文件夹中。我还手动将它复制到解决方案的每个Debug文件夹中 - 没有运气。

注意:

  • 在升级到.Net4之前,这是完全相同的代码。
  • 我之前确实看到了一些x64 x86不匹配问题,但我已经切换到使用x86作为目标平台和所有引用的dll。我已经验证Debug-folder中的所有文件都是x86。
  • 我已经尝试了预编译的Fluent dll,我已经尝试过编译自己,并且我已经使用.Net4编译了我自己的Fluent版本。
  • 我看到有also others that have seen this problem,但我还没有看到任何解决方案。

在@ devio的回答之后,我尝试添加对SQLite dll的引用。这没有改变任何东西,但我希望我做对了..这是我添加到app.config文件的根节点的内容:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <qualifyAssembly partialName="System.Data.SQLite" fullName="System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </assemblyBinding>
</runtime>

有没有人使用Fluent成功使用.Net4和SQLite?救命!我迷路了...

7 个答案:

答案 0 :(得分:8)

当我尝试使用.Net4和SQLite时,我也收到了同样的错误信息,但是当我仔细观察时,我发现了不同的错误信息。

无法加载System.Data.SQLite.SQLiteConnection,System.Data.SQLite类型。 System.IO.FileLoadException:混合模式程序集是针对运行时的版本“v2.0.50727”构建的,如果没有其他配置信息,则无法在4.0运行时加载。

所以我所做的就是将useLegacyV2RuntimeActivationPolicy =“true”添加到“startup”标签中。

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

我不需要在“runtime”标记内添加dependentAssembly或任何内容。根据此link text和此link text,它应仅用于迁移辅助。所以希望SQLite很快就会更新。

希望这有帮助! Karlkim

答案 1 :(得分:7)

检查System.Data参考的版本。听起来像System.Data.SqlLite一样,找不到它所构建的IDbCommand和IDbConnection的版本,我怀疑它是版本2.0.0.0。我怀疑现在你已升级到.Net 4,你引用的是System.Data版本4.0.0.0。

如果是这种情况,您应该能够添加绑定重定向来解决问题:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089"/>
        <bindingRedirect oldVersion="2.0.0.0" newVersion="4.0.0.0"/>
    </dependentAssembly>
</assemblyBinding>

答案 2 :(得分:2)

我在NH,VS2010,.Net4上遇到了类似的问题,但是使用了Oracle ODP.Net驱动程序和32位。

解决方案是在web.config文件中声明一个带有显式版本号的“限定程序集”。查看我的summary

也许此解决方案也适用于您的问题。

答案 3 :(得分:2)

我设法通过在项目调试设置中将目标平台更改为x86来解决此问题。我正在使用vs2010。

答案 4 :(得分:1)

是的先生:使用.NET 4 - Fluent NHibernate - NUnit

通过使用上述帖子中的信息,我设法让它在Visual Studio 2010下运行 在我的NUnit库中进行测试,在调试模式下为Any CPU编译。

首先,我一直得到与你们中的一些人相同的例外情况:

  

无法从NHibernate.Driver.SQLite20Driver,NHibernate,Version = 3.1.0.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4创建驱动程序。

我已经使用NUGet下载.NET的v4.0.30319的SQLite的1.0.76.0版本。上面的Devios帖子和他的摘要链接让我在我的App.config文件中测试assemblyBinding - 告诉VS 2010为NHibernate使用正确版本的System.Data.SQLite。这是我在App.Config中的内容:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly partialName="System.Data.SQLite" 
      fullName="System.Data.SQLite, Version=1.0.76.0, 
      Culture=neutral, 
      PublicKeyToken=db937bc2d44ff139"/>
    </assemblyBinding>
  </runtime>

我如何知道将哪些细节放在App.config中?

我之前也在SQLite网站的下载部分安装了SQLite .NET 4版本的静态链接库。这将SQLite库安装到我的计算机并将其添加到全局程序集缓存中 - 这反过来又为我提供了使用Visual Studio命令提示符2010编辑App.config所需的信息:

  

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC&gt; gacutil -l   System.Data.SQLite Microsoft(R).NET全局程序集缓存实用程序。   版本4.0.30319.1版权所有(c)Microsoft Corporation。所有权利   保留

     

全局程序集缓存包含以下程序集:
  System.Data.SQLite,Version = 1.0.76.0,Culture = neutral,   PublicKeyToken = db937bc2d44ff139,processorArchitecture = AMD64

     

项数= 1

通常我会使用.NET Reflector from RedGate来提取我之前添加的NUget System.Data.SQLite dll文件的dll信息,但是如果你已经将SQLite安装到系统中gacutil -l System.Data.SQLite就可以了,正确的版本。

以前我也有混合模式汇编异常:

  

无法加载System.Data.SQLite.SQLiteConnection类型,   System.Data.SQLite。 System.IO.FileLoadException:混合模式程序集   是针对运行时的版本'v2.0.50727'构建的,不能   无需额外配置即可在4.0运行时加载   信息。

然后,如果我想使用.NET 2.0版本的SQLIte,我会将以下内容插入到我的App.config中:

 <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

但是现在我有一个.NET4版本的SQLite,我不需要运行旧的.NET 2版本和传统模式 - 避免使用进程内并行运行时主机激活的潜在冲突 - Google MSDN:

  

当较新版本的.NET Framework CLR加载程序集时   这是针对以前版本的CLR构建的兼容性   问题可能发生,应用程序可能会停止工作。这个   任何托管程序集都可能发生,包括完整的应用程序和   在插件中(托管程序集在一个上下文中运行)   主持人申请)。保证更新版本的唯一方法   .NET Framework没有影响现有的应用程序   所有现有托管应用程序都在其原始目标中运行   编译.NET Framework版本。

感谢你们所有人指出我正确的方向! 希望从现在开始,我们之后的其他人更容易解决这个问题。

答案 5 :(得分:0)

  

无法从NHibernate.Driver.SQLite20Driver,NHibernate,Version = 2.1.2.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4

创建驱动程序

解决方案:

测试设置:
选择主机
在64位机器上选择64位进程运行测试

答案 6 :(得分:0)

我尝试了此页面上的所有解决方案,但没有任何效果。然后我卸载了我的64位版本并使用了Nuget的x86版本,一切正常。

PM&GT; Install-Package System.Data.SQLite.x86