簡體   English   中英

使用第三個數據類庫項目在asp.net core項目和.net core控制台項目之間共享Sqlite數據庫

[英]Share Sqlite database between asp.net core project and .net core console project with a third data class library project

我在 vs2019 解決方案中有 3 個項目,它們應該使用 Entity Framework Core 使用相同的 sqlite 數據庫。

第一個項目:包含所有數據庫模型、數據庫上下文、數據庫存儲庫和遷移的 .net 核心類庫。

第二個項目:一個 .net 核心控制台應用程序,它需要掃描文件、從 inet 檢索元數據並用檢索到的內容為數據庫做種子。 這是通過引用第一個項目並使用存儲庫訪問數據庫來完成的。

第三個項目:一個Asp.net核心Webapi,需要接受客戶端請求,從同一個數據庫中檢索、更新等數據。 這也是通過引用第一個項目並使用存儲庫來完成的。 這個項目是主項目,需要的時候需要啟動第二個項目。

所有項目都需要能夠安裝在面向 Windows、MacOS 和 Linux 的客戶端計算機上。 並自托管。 它必須像一個類似於 Plex、Emby 和 Calibre 的內容服務器。

我的問題是如何創建數據源選項字符串以便能夠使用相同的 db 文件並將該文件復制到 Asp.net 核心 Webapi 項目的位置。

我現在在第一個項目的 dbcontext 文件中有這個:

    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

        #region DbSets
        public DbSet<Authors> Authors { get; set; }
        ...
        ...

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {

        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            builder.UseSqlite("Data Source=Chapter.db");
            return new ApplicationDbContext(builder.Options);
        }
    }

這在我的第一個項目的存儲庫類中:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    private DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
    public ApplicationDbContext _context = null;
    public DbSet<T> table = null;
    public GenericRepository()
    {
        _optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>().UseSqlite("Data Source=Chapter.db");
        this._context = new ApplicationDbContext(_optionsBuilder.Options);
        table = _context.Set<T>();
    }

當我使用實體框架從第一個項目中的遷移創建數據庫時,它會在第一個項目的主文件夾中創建 Chapter.db 文件。

在我的 Asp.net Webapi 項目中,我有這個來使用數據庫:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite("Data Source=Chapter.db"));

我需要這行代碼還是可以使用第一個項目中的存儲庫類?

當我構建解決方案時,我將所有項目的 dll 放在第三個項目的調試文件夾中,但沒有chapter.db 數據庫文件。

在為調試和發布而構建時,如何在正確的項目輸出目錄中自動復制 db 文件?

我需要為 Datasource= 連接字符串使用什么來確保人們安裝應用程序后它以 db 文件為目標(在 windows、linux 和 macos 中)?

我已經閱讀了兩個類似問題的答案以供使用:

Var SqlitePath = Path.combine(

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
@"<YourAppName>\Chapter.db");

和:

var builder = new SqliteConnectionStringBuilder(connectionString);
builder.DataSource = Path.GetFullPath( Path.Combine(
AppDomain.CurrentDomain.GetData("DataDirectory") as string ?
AppDomain.CurrentDomain.BaseDirectory, builder.DataSource);
connectionString = builder.ToString();

這些答案是否具有相同的結果? 我能否在 asp.net 核心項目以及 .net 核心控制台應用程序中使用其中之一?

這是否跨平台工作?

我有點晚了,我假設您已經弄清楚了這一點,但我正在寫這個答案,因為它是我的一次谷歌搜索的最佳結果。

手頭的問題是指向數據庫的正確位置。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite("Data Source=Chapter.db"));

這行代碼將在您運行它的任何項目的項目目錄中創建一個名為“Chapter.db”的數據庫。問題的解決方案已在您的問題底部提供。

Var SqlitePath = Path.combine(

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
@"<YourAppName>\Chapter.db");

此代碼會將數據庫的相對路徑(基於項目目錄)轉換為絕對路徑(基於您的文件系統,即 C:...\\Chapter.db 或 /home/.../Chapter。 D b)。 你提供的另一個 blob 應該做同樣的事情,但有更多的代碼行。 閱讀SqliteConnectionStringBuilder文檔后,似乎后者具有更多功能,允許通過代碼添加密碼和其他有趣的東西,而不是手動輸入字符串。

在這種情況下,絕對路徑會有所幫助,因為它允許您指定正在使用的數據庫文件的直接路徑。 否則,您將需要修改連接字符串以對每個項目使用相對路徑,如果它們移動到文件系統的不同部分,這可能會變得復雜。 它仍然可以做到。 例如,如果兩個項目位於同一位置,則在您的數據庫名稱前附加“../”就足以為所有項目提供相同的位置。

使用絕對路徑,您只需指定一個位置,例如“C:\\Chapter.db”,您的所有項目都將使用該位置的數據庫而不是它們的單個文件。

暫無
暫無

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

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