使用 SQLite 数据库进行 EF Core 迁移:无法创建类型的对象

Pio*_*rek 1 c# entity-framework entity-framework-core

我正在尝试使用 Entity Framework Core 对 SQLite 数据库进行初始迁移。

我的解决方案由两个项目组成:控制台应用程序和类库(包含 DbContext 和所有模型)。

DbContext 看起来像这样:

public class SQLite_DbContext : DbContext
{
    public DbSet<DeviceRepresentation> Devices { get; set; }
    public DbSet<FileInfoDatabaseRepresentation> Files { get; set; }

    public SQLite_DbContext(DbContextOptions<SQLite_DbContext> options)
        : base(options)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在类库中(我保存 DbContext 的地方),我正在尝试创建迁移:

dotnet ef migrations add InitialCreate
Run Code Online (Sandbox Code Playgroud)

结果,dotnet cli 返回错误:

无法创建类型为“SQLite_DbContext”的对象。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728

你能看出这里有什么问题吗?

Pio*_*rek 5

我可能已经找到了解决方案。在文档[here] 中生成迁移时,对幕后发生的事情有一个很好的解释。

就我而言,根据文档,EF Core Tools 正在尝试创建一个SQLite_DbContext不向构造函数传递参数的实例。我的代码中没有这样的构造函数,因为只有一个带有一个参数 ( options)。这就是它“无法创建对象”的原因。当我从代码中删除自定义构造函数时,它开始正确生成迁移。

或者,如我所见,还有一个选项可以控制 DbContext 的创建方式。可以创建“工厂”,EF 工具将使用它来生成此类的实例:

public class SQLite_DbContextFactory : IDesignTimeDbContextFactory<SQLite_DbContext>
    {
        public SQLite_DbContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<SQLite_DbContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new SQLite_DbContext(optionsBuilder.Options);
        }
    }
Run Code Online (Sandbox Code Playgroud)