EFCore SQLite 连接字符串与asp.net 中的相对路径

pet*_*erc 3 asp.net sqlite asp.net-web-api ef-core-2.0

我刚刚将 SQLite 添加到我的 asp.net webApi 项目中,并且无法确定如何将 App_Data 文件夹的路径传递给 DbContextOptionsBuilderUseSqlite

我在web.configI have a link to an external a config file with the conenction string ...

<connectionStrings configSource="config\connectionStrings.config"/>
Run Code Online (Sandbox Code Playgroud)

在那里我有...

    <connectionStrings>
      <add name="MyDatastore"
             connectionString="DataSource=./App_Data/test.sqlite" />
    </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

而在我的DbContext.OnConfiguring我有....

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

路径被正确检索(我可以看到我得到了配置的路径 connectionStrings.config

所以./App_Data/test.sqlite传递给optionsBuilder.UseSqlite(path).

但是,我收到以下错误...

SQLite Error 14: 'unable to open database file'. 
Run Code Online (Sandbox Code Playgroud)

如果我刚刚使用connectionString="DataSource=test.sqlite" />它似乎神奇地在 App_Data 文件夹中找到该文件,当我在我的开发机器上运行调试时,但我在另一台机器(发布版本)上遇到了问题。我认为这是路径,尽管我得到的只是“无法打开数据库文件”。

我也试过了。。

 connectionString="DataSource=|DataDirectory|test.sqlite" />
Run Code Online (Sandbox Code Playgroud)

这给了我一个Illegal characters in path错误。

以下确实有效(完整路径)

 connectionString="d:\0\test.sqlite" />
Run Code Online (Sandbox Code Playgroud)

但我希望能够使用相对路径,例如甚至.\datastore\test.sqlite.

有没有人对此有任何想法?

提前致谢

bri*_*lam 7

您必须在运行时修复相对路径:

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();
Run Code Online (Sandbox Code Playgroud)