实体框架 SQLite 错误 1:“没有这样的表:__EFMigrationsHistory”

Pat*_*ick 4 .net sqlite entity-framework

我在 Windows 和 Linux 上运行 EF Core,并且在两者上都遇到相同的问题。

public string DbPath { get; }

string DbPath = $ "{Environment.GetFolderPath(Environment.SpecialFolder.Personal)}{Path.DirectorySeparatorChar}smart_contracts.db";
Run Code Online (Sandbox Code Playgroud)

这会打印 Linux 和 Windows 10 上的路径。当我尝试运行时,Add-Migration出现Update-DatabaseSQLite 错误

错误 1:“没有这样的表:__EFMigrationsHistory”。错误。

代码:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlite($"Data Source={DbPath}");
}
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为Data Source=smart_contracts.db,它在两个平台上都能完美运行。

谁能帮我获取数据源字符串的路径?

Krz*_*z01 6

在我看来,问题在于您想要在已经结构化且不是由实体框架生成的数据库上执行迁移。这可以解释缺少迁移表的原因。要使用此数据库,您应该对数据库结构进行逆向工程。如果您不想更改数据库端或应用程序端的结构(因为,假设您自己实现了实体),您所需要做的就是在配置 DbContext 时指定数据库文件的本地化(正如您的帖子中所示)就是这样。

下面是一个 SQLite 数据库支架的示例:

Scaffold-DbContext "DataSource=file.sqlite3 "Microsoft.EntityFrameworkCore.Sqlite -OutputDir Models
Run Code Online (Sandbox Code Playgroud)

编辑: 问题显然源于如何组合数据库文件的路径。更好的做法是使用该Path.Combine()方法而不是字符串连接。

  • 现在查看 DbPath 变量,我注意到路径是如何连接的。使用 Path.Combine 是比使用字符串接触更好的做法。重构这行代码后尝试迁移或者将路径作为字符串直接放入UseSqlite()方法中进行测试,看看是否是路径合并导致的错误 (2认同)