EFCore SQLite连接字符串,在asp.net

时间:2018-03-15 01:30:34

标签: asp.net sqlite asp.net-web-api ef-core-2.0

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

我在web.config中有以下内容我有一个带有conenction字符串的外部配置文件的链接...

<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

有人对此有任何想法吗?

提前致谢

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

对我来说很完美。

{
    "__type": "com.amazon.coral.service#SerializationException"
}

答案 2 :(得分:0)

注意:此解决方案已针对 .Net Core 5 进行了测试,可以假设它适用于 2.x、3.x、5

如果要使用与启动时提供的项目不同的项目,则必须在 appsettings.json 中指定正确的路径(“Data Source = ..\\MyApplication.DAL\\sqliteDatabase.db”) .

在本例中,您甚至不需要在 ApplicationDbContext.cs 中编写方法 OnConfiguring(DbContextOptionsBuilder optionsBuilder)。

您有一个完整的设置(启动和 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"
  }