如何在 EF Core 3 的不同项目中输出 SQLite 数据库

How to output SQLite database in a different project in EF Core 3

我有一个包含 2 个项目的解决方案

src
|-ProjectA
|-ProjectB

ProjectA 是一个针对 netstandard2.1 的 class 库,它包含 DbContext(具有 "Data Source=blog.db")、实体并且依赖于 Microsoft.EntityFrameworkCore.Sqlite

ProjectB 以 netcoreapp3.1 为目标并依赖于 Microsoft.EntityFrameworkCore.Design。我只是用它来管理迁移,因为迁移需要一个框架。

SQLite 数据库不存在,因此我使用 ProjectB 中的 dotnet 工具创建了第一个迁移

dotnet ef migrations add InitialCreate --project ../ProjectA

并且成功创建了包含初始文件夹的 Migrations 文件夹。

现在我想更新数据库,以便实际创建 SQLite *.db。 如果我这样做:

dotnet ef database update --project ../ProjectA

*.db 文件已创建,但在 ProjectB 中。我想在 ProjectA 中输出文件,但找不到方法。

文档似乎没有提及任何内容,ef database update --help


更新 1:我尝试从 ProjectA 创建和更新迁移并指向可执行项目,如下所示:

dotnet ef migrations add InitialCreate --startup-project ../ProjectB

并在 ProjectA 中正确创建迁移。现在我尝试应用它们来生成 *.db,如下所示:

dotnet ef database update --startup-project ../ProjectB

并生成 *.db 文件...但又是在 ProjectB 中!不在我想要的 ProjectA 中。

好像Microsoft.EntityFrameworkCore.Design包在哪里,生成的数据库就在那里


更新 2:在更新数据库以指向 DbContext 所在的位置时指定项目也不起作用。它在项目 B

中不断生成 *.db
dotnet ef database update --startup-project ../Sasw.SimpleBlog.Storage.SQLite.Migrator/ --project ./

我通过在我的连接字符串中指定完整路径来修复它。这已经足够了,因为这个路径应该可以在设置中配置。

public class DatabaseContext
    : DbContext
{
    public DbSet<Thing> Things{ get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlite("Data Source=D:\database.db");
    }
}

这里剩下的唯一问题是如何使用 dotnet ef CLI 在运行时传递此连接字符串。但这似乎是一个悬而未决的问题 atm https://github.com/aspnet/EntityFrameworkCore/issues/10750

我知道这个回复有点晚了,但也许这有帮助,我还没试过。 您是否尝试过在 Visual Studio 的包管理器控制台中选择不同的默认项目?