我在 Windows 和 Linux 上运行 EF Core,并且在两者上都遇到相同的问题。
public string DbPath { get; }
string DbPath = $ "{Environment.GetFolderPath(Environment.SpecialFolder.Personal)}{Path.DirectorySeparatorChar}smart_contracts.db";
这会打印 Linux 和 Windows 10 上的路径。当我尝试运行
Add-Migration
和 Update-Database
时,我收到 SQLite 错误
错误 1:“没有这样的表:__EFMigrationsHistory”。错误。
代码:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data Source={DbPath}");
}
如果我将其更改为
Data Source=smart_contracts.db
,它在两个平台上都能完美运行。
任何人都可以帮我获取数据源字符串的路径吗?
在我看来,问题在于您想要在已经结构化且不是由实体框架生成的数据库上执行迁移。这可以解释缺少迁移表的原因。要使用此数据库,您应该对数据库结构进行“逆向工程”。如果您不想更改数据库端或应用程序端的结构(因为,假设您自己实现了实体),您所需要做的就是在配置 DbContext 时指定数据库文件的本地化(正如您的帖子中所示)就是这样。 这里是一个 SQLite 数据库脚手架的示例:
Scaffold-DbContext "DataSource=file.sqlite3 "Microsoft.EntityFrameworkCore.Sqlite -OutputDir Models
问题显然源于如何组合数据库文件的路径。更好的做法是使用 Path.Combine()
方法而不是字符串连接。
ASPNETCORE_ENVIRONMENT
从
Production
更改为 Development
。将其留在这里以防万一有帮助。
必须在自定义数据库上下文上创建没有构造函数的 sqlite 数据库
然后必须使用这个构造函数运行应用程序
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}