使用FluentNHibernate + SQLite与.NET4的问题?

sti*_*k81 12 .net sqlite .net-4.0 fluent-nhibernate

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

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

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

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版本.
  • 我看到还有其他人已经看到了这个问题,但我还没有真正看到任何解决方案.

在@ 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>
Run Code Online (Sandbox Code Playgroud)

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

kim*_*msk 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>
Run Code Online (Sandbox Code Playgroud)

我不需要在"runtime"标记内添加dependentAssembly或任何内容.根据此链接文本和此链接文本,它应仅用于迁移辅助.所以希望SQLite很快就会更新.

希望这可以帮助!Karlkim


s1m*_*m0t 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>
Run Code Online (Sandbox Code Playgroud)