[英]Reuse legacy .net 4.7.2 libs with EF 6.4 + Oracle.ManagedDataAccess.EntityFramerowk with a .net core 3.1 app?
[英]Using EF Core 3.1 SQLite database in .NET 4.7.2 class library
我在 .NET 4.7.2 項目中包含了 package Microsoft.EntityFrameworkCore.Sqlite
(最新的 3.1.x 版本)。 這是我的DbContext
的OnConfiguring
方法:
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlite($@"Data Source=D:\MyDb.db");
}
我從另一個 .NET 4.7.2 項目中引用了 class 庫。
每當我嘗試讀取、寫入或創建數據庫(如dbContext.Database.EnsureCreated();
)時,我會在TypeInitializationException
構造函數上獲得以下SqliteConnection
以及以下 InnerException:
消息: The path has an invalid format
堆棧跟蹤:
at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
at System.IO.Path.InternalGetDirectoryName(String path)
at SQLitePCL.NativeLibrary.MakePossibilitiesFor(String basename, Assembly assy, Int32 flags, LibSuffix suffix)
at SQLitePCL.NativeLibrary.MyLoad(String basename, Assembly assy, Int32 flags, Action`1 log)
at SQLitePCL.NativeLibrary.Load(String libraryName, Assembly assy, Int32 flags)
at SQLitePCL.Batteries_V2.MakeDynamic(String name, Int32 flags)
at SQLitePCL.Batteries_V2.DoDynamic_cdecl(String name, Int32 flags)
at SQLitePCL.Batteries_V2.Init()
我猜路徑與我的 ConnectionString 有關,但我看不出它有什么問題。
出於測試目的,我創建了一個 .NET 5 項目並從那里引用了 4.7.2 class 庫。 如果我調用dbContext.Database.EnsureCreated();
在這個項目中,它按預期工作並創建了數據庫。
所以我想這是關於 .NET 4.7.2 和 EF Core 混合的問題。 但根據Microsoft Docs EF Core 3.1 應該可以與 .NET 4.7.2 一起正常工作
也許與 EF Core 的 SQLite 適配器有關?
TypeInitializationException
誤導了我。 最后,我在 .NET 4.7.2 項目中使用的Costura.Fody
package 將所有 DLL 捆綁到一個 *.exe 文件中存在問題。
似乎這不適用於 SQLite 庫。 無論出於何種原因,沒有包含SQLitePCLRaw.*.dll
文件,這導致了所描述的TypeInitializationException
。 通常,如果不包括 DLL,則會收到FileNotFoundException
。
在類似的問題上看到這個答案,不幸的是我只是在我在這里發布我的問題后才發現的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.