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

时间:2019-10-07 14:37:24

标签: 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)
    {
    }
}

在类库中(我保留了DbContext),我正在尝试创建迁移:

dotnet ef migrations add InitialCreate

结果,dotnet cli返回错误:

  

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

您能看到这里有什么问题吗?

3 个答案:

答案 0 :(得分:2)

我可能已经找到了解决方案。关于在文档[here]中生成迁移时引擎盖下发生的事情有很好的解释。

在我看来,根据文档,EF核心工具正在尝试创建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);
        }
    }

答案 1 :(得分:1)

如果我还记得的很好,SQLite不支持迁移。 如果解决方法可以满足您的需求,则可以关注此帖子 https://medium.com/@hoekje/simple-migrations-with-c-and-sqlite-9942e1863536

答案 2 :(得分:0)

我遇到了这个错误,我的解决方案也分为两个项目:一个控制台应用程序 MyProject.Api 和一个类库 MyProject,但由于我通过 {{1 }},我无法使用 IConfiguration 解决方案,因为它只能获得 IDesignTimeDbContextFactory

事实证明,无需创建工厂即可解决问题,解决方案是为 string[] args 命令行提供更多上下文,如下所示:

dotnet ef

这将在 dotnet ef migrations add InitialCreate --project src/MyProject --startup-project src/MyProject.Api 的根目录创建一个 Migrations 目录。如果您想在其他地方创建类(例如在 src/MyProject 中),请将此参数添加到命令行:Data/Migrations