簡體   English   中英

使用FluentNHibernate + SQLite與.NET4的問題?

[英]Problems using FluentNHibernate + SQLite with .NET4?

我有一個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();                    

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>

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

當我嘗試使用.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或任何內容。 根據此鏈接文本和此鏈接文本 ,它應僅用於遷移輔助。 所以希望SQLite很快就會更新。

希望這可以幫助! Karlkim

檢查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>

我與NH,VS2010,.Net4有類似的問題,但是使用了Oracle ODP.Net驅動程序和32位。

解決方案是在web.config文件中聲明一個帶有顯式版本號的“限定程序集”。 看我的總結

也許這個解決方案也適用於您的問題。

我設法通過在項目調試設置中將目標平台更改為x86來解決它。 我正在使用vs2010。

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

通過使用上述帖子中的信息,我設法讓它在Visual Studio 2010和我的NUnit庫中工作以進行測試,在調試模式下為任何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> 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

通常我會使用RedGate的.NET Reflector來提取我之前添加的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版本中運行。

感謝你們所有人指出我正確的方向! 希望從現在開始,我們之后的其他人更容易解決這個問題。

我在這個頁面上嘗試了所有解決方案,但沒有任 然后我卸載了我的64位版本並使用了Nuget的x86版本,一切正常。

PM> Install-Package System.Data.SQLite.x86

無法從NHibernate.Driver.SQLite20Driver,NHibernate,Version = 2.1.2.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4創建驅動程序

解:

測試設置:
選擇主機
在64位機器上選擇64位進程運行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM