将实体框架核心SQLite文件存储在项目相关子目录中

时间:2018-03-30 05:46:03

标签: c# sqlite asp.net-core entity-framework-core asp.net-core-2.0

我有一个使用Entity Framework Core和SQLite Provider的ASP.NET Core 2.0应用程序。我试图将SQLite数据库文件存储在子目录(特别是data\database\sqlite.db)中,但是如果我将连接字符串设置为Data Source=data\database\sqlite.db,则在运行dbContext.Database.Migrate()时会出现以下异常:< / p>

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 14: 'unable to open database file'.

如果我将它设置为Data Source=sqlite.db,它会按预期工作而不会抛出异常(但不会在我需要存储的目录中)。如何将SQLite数据库文件存储在相对于当前工作目录的子目录中?

为了上下文:我需要存储在子目录中的SQLite数据库文件,因为此应用程序在Docker容器中运行,此特定目录映射到Docker卷,因此在更换容器时数据库仍然存在。

2 个答案:

答案 0 :(得分:0)

您应该修改为"Data Source=./data/database/sqlite.db"

"DefaultConnection": "DataSource=./data/database/sqlite.db"

答案 1 :(得分:0)

我有类似的问题。 我想您正在.NET Core环境中运行您的应用程序。您可以在“ DbContext”类中执行此操作:

internal class YourDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        string baseDir = AppDomain.CurrentDomain.BaseDirectory;

        //if "bin" is present, remove all the path starting from "bin" word
        if (baseDir.Contains("bin"))
        {
            int index = baseDir.IndexOf("bin");
            baseDir = baseDir.Substring(0, index);
        }

        //String interpolation to reach the right path
        options.UseSqlite($"Data Source={baseDir}YourFolderName\\SQLite.db");
    }

    public DbSet<YourEntity> Pluto { get; set; }

}