Строка подключения EFCore SQLite с относительным путем в asp.net

Я только что добавил SQLite в свой проект webApi asp.net, и мне трудно понять, как получить путь к папке App_Data для перехода к DbContextOptionsBuilderUseSqlite

У меня есть следующее в web.config У меня есть ссылка на внешний файл конфигурации со строкой соединения...

<connectionStrings configSource="config\connectionStrings.config"/>

а там у меня...

    <connectionStrings>
      <add name="MyDatastore"
             connectionString="DataSource=./App_Data/test.sqlite" />
    </connectionStrings>

А в моем DbContext.OnConfiguring у меня есть....

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
          if (!optionsBuilder.IsConfigured)
          {
            string path = WebConfigurationManager.ConnectionStrings["MyDatastore"].ConnectionString;
            optionsBuilder.UseSqlite(path);
          }
    }

Путь получен правильно (я вижу, что получаю путь, настроенный на connectionStrings.config

поэтому ./App_Data/test.sqlite передается optionsBuilder.UseSqlite(path).

Однако я получаю следующую ошибку...

SQLite Error 14: 'unable to open database file'. 

Если я использую только connectionString="DataSource=test.sqlite" />, то кажется, что он волшебным образом находит файл в папке App_Data, когда я запускал свою машину разработки в режиме отладки, но у меня были проблемы на другой машине (релизная сборка). Я предполагаю, что это путь, хотя все, что я получаю, это «невозможно открыть файл базы данных».

я тоже пробовала..

 connectionString="DataSource=|DataDirectory|test.sqlite" />

Это дает мне ошибку Illegal characters in path.

Следующее работает (полный путь)

 connectionString="d:\0\test.sqlite" />

Но я хочу иметь возможность использовать относительные пути, например, может быть, даже .\datastore\test.sqlite.

У кого-нибудь есть идеи по этому поводу?

заранее спасибо


person peterc    schedule 15.03.2018    source источник


Ответы (3)


Вам придется исправить относительные пути во время выполнения:

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();
person bricelam    schedule 15.03.2018

Отлично работает для меня.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var dataSource = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "siteDB.db");
    optionsBuilder
        .UseSqlite($"Data Source={dataSource};");
}
person Danil Shaykhutdinov    schedule 22.08.2020

Примечание. Это решение было протестировано для .Net Core 5, и можно предположить, что оно будет работать на 2.x, 3.x, 5

Если вы хотите использовать проект, отличный от того, который был предоставлен при запуске, необходимо указать правильный путь (источник данных = ..\\MyApplication.DAL\\sqliteDatabase.db) в файле appsettings.json.

В представленном случае вам даже не нужно писать метод OnConfiguring(DbContextOptionsBuilder optionsBuilder) в ApplicationDbContext.cs.

У вас есть полная настройка ниже (Startup & appsettings.json).

Структура моего проекта:

 -> MyApplication (solution)
      -> MyApplication.UI (initial project of the solution)
      -> MyApplication.BL (project)
      -> MyApplication.DAL (project)

Внутри Startup.cs

 public void ConfigureServices(IServiceCollection services)
        {
           //... other services 
           
           services.AddDbContext<ApplicationDbContext>
                (x => x.UseSqlite(Configuration.GetConnectionString("SqliteConnection")));
           
           //.... other services and logic
        }

В appsettings.json:

 "ConnectionStrings": {
    "SqliteConnection": "Data Source = ..\\MyApplication.DAL\\sqliteDatabase.db"
  }
person Vlad Bulete    schedule 26.01.2021