代码之家  ›  专栏  ›  技术社区  ›  stiank81

对.net4使用FluentHibernate+sqlite时出现问题?

  •  12
  • stiank81  · 技术社区  · 15 年前

    我有一个wpf应用程序使用vs2010.net3.5运行,它使用nhibernate和fluenthibernate+sqlite,并且都可以正常工作。

    现在我想改为使用.net4,但这已经变成了比我预期的更痛苦的经历。设置连接时,我执行以下操作:

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

    buildsessionFactory()调用引发FluentConfigurationException,并说:

    创建会话工厂时使用了无效或不完整的配置。有关更多详细信息,请查看潜在原因集合和InnerException。

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

    无法从nhibernate.driver.sqlite20driver,nhibernate,version=2.1.2.4000,culture=neutral,publickeytoken=aa95f207798dfdb4创建驱动程序。

    以及进一步的神经感受:

    在程序集system.data.sqlite中找不到IDBCommand和IDBConnection实现。确保assembly system.data.sqlite位于应用程序目录或全局程序集缓存中。如果程序集在GAC中,请使用应用程序配置文件中的元素指定程序集的全名。

    现在-对我来说,好像找不到 System.Data.SQLite.dll 但我不明白。在引用它的任何地方,我都有“copy local”,并且我已经验证了它在使用sqlite的项目的每个构建文件夹中。我还手动地将它复制到解决方案的每个调试文件夹中-没有运气。

    笔记:

    • 这与我升级到.net4之前运行良好的代码完全相同。
    • 我之前确实看到一些X64 x86不匹配的问题,但我已经切换到使用x86作为目标平台和所有引用的DLL。我已经验证了debug文件夹中的所有文件都是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 with.net4和sqlite吗?救命!我迷路了…

    7 回复  |  直到 8 年前
        1
  •  7
  •   s1mm0t    15 年前

    检查系统的版本。数据引用。在我看来,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
  •  8
  •   Community CDub    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很快就会更新。

    希望这有帮助! 卡尔金

        3
  •  2
  •   devio    15 年前

    我在nh,vs2010,.net4上也有类似的问题,但是在OracleODP.net驱动程序和32位驱动程序上。

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

    也许这个解决方案也适用于你的问题。

        4
  •  2
  •   BartoszKP    8 年前

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

        5
  •  1
  •   Yi Jiang G-Man    13 年前

    是的,先生:让它和.NET 4一起工作-流畅的NHibernate-Nunit

    通过使用上述文章中的信息,我设法使它在Visual Studio 2010下工作。 在我的nunit库中进行测试,在调试模式下为任何CPU编译。

    首先,我得到了和你们中一些人一样的例外:

    无法从nhibernate.driver.sqlite20driver,nhibernate,version=3.1.0.4000,culture=neutral,publickeytoken=aa95f207798dfdb4创建驱动程序。

    我用nuget下载了1.0.76.0版sqlite for v4.0.30319 of.net。上面的devios帖子和他的摘要链接让我进入了app.config文件中的测试程序集绑定——告诉vs 2010使用正确版本的system.data.sqlite for nhibernate。以下是我在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:\程序文件(x86)\Microsoft Visual Studio 10.0\vc>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信息,但 gacutil -l System.Data.SQLite 如果您已经在系统中安装了sqlite,那么它是正确的版本。

    以前我还得到了混合模式程序集异常:

    无法加载类型System.Data.sqlite.sqliteConnection, 系统.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>
    

    但是现在我有了.NET 4版本的sqlite,我不需要运行旧的.NET 2版本和旧的模式-避免在进程内并行运行时主机激活时进一步使用潜在冲突-Google msdn:

    当较新版本的.NET Framework CLR加载程序集时 它是根据以前版本的clr构建的,兼容性 可能会发生问题,应用程序可能会停止工作。这 在完全应用程序和 在插件中(托管程序集在 主机应用程序)。唯一能保证 .NET框架不影响现有应用程序 所有现有的托管应用程序都在其原始目标中运行 已编译.NET Framework版本。

    感谢你们为我指明了正确的方向! 希望我们之后的其他人能从现在开始解决这个问题。

        6
  •  0
  •   Yi Jiang G-Man    13 年前

    无法从nhibernate.driver.sqlite20driver,nhibernate,version=2.1.2.4000,culture=neutral,publickeytoken=aa95f207798dfdb4创建驱动程序

    解决方案:

    测试设置:
    选择主机
    选择在64位计算机上的64位进程中运行测试

        7
  •  0
  •   tkunstek    12 年前

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

    pm>安装包system.data.sqlite.x86