我刚刚将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
。
有人对此有任何想法吗?
提前致谢
答案 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"
}