我有一个运行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文件夹中 - 没有运气。
注意:
在@ 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?救命!我迷路了...
答案 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)
通过使用上述帖子中的信息,我设法让它在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