C# 实体框架核心:无法添加迁移:无参数构造函数

C# 实体框架核心:无法添加迁移:无参数构造函数,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我的数据项目参考:(实体框架核心) netcoreapp1.1 数据库上下文: public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected overri

我的数据项目参考:(实体框架核心)


netcoreapp1.1
数据库上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {  ....
     }
}
public class ApplicationUser : IdentityUser
{
}
public类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项):基本(选项){}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{  ....
}
}
公共类应用程序用户:IdentityUser
{
}
每次我尝试命令

dotnet ef迁移添加Init--详细

,我得到了错误。在我将数据项目与主项目分离之前,它可以正常工作

Microsoft.EntityFrameworkCore.Design.OperationException:无无参数构造 在“ApplicationDbContext”上找到了构造函数。或者添加一个无参数构造函数 r到“ApplicationDbContext”,或在与“ApplicationDbContext”相同的程序集中添加“IDbContextFactory”的实现。-->系统 ssingMethodException:没有为此对象定义无参数构造函数。 在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔publicOn ly、Boolean noCheck、Boolean&canBeCached、RuntimeMethodHandleInternal&ctor、Bo olean和bNeedSecurityCheck)


这和错误说的一模一样。在DbContext类上需要一个无参数构造函数(这基本上是无法做到的),或者实现
IDbContextFactory

我使用的方法是创建
IDbContextFactory
的实现,并从
create
方法返回我的DbContext实例,如下所示:

public class ApplicationDbContext : DbContext<ApplicationDbContext>
{
    // DbContext code as normal
}

public class ApplicationDbContextFactory : IDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext Create(DbContextFactoryOptions options)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        return new ApplicationDbContext(optionsBuilder.Options);
    }
}
公共类ApplicationDbContext:DbContext
{
//DbContext代码正常
}
公共类ApplicationDbContextFactory:IDbContextFactory
{
公共应用程序DBContext创建(DbContextFactoryOptions)
{
var optionsBuilder=new DbContextOptionsBuilder();
返回新的ApplicationDbContext(optionsBuilder.Options);
}
}
注意:您必须创建一个
DbContextOptionsBuilder
来传递到
DbContext
,但是由于迁移实际上不会命中数据库并读取实体类,因此我认为您不需要实际配置任何选项,可能除了数据库提供程序之外,因为我遇到了为一个提供程序而不是另一个提供程序生成的迁移代码的问题


现在,当您运行迁移时,EF应该自动找到Factory类并使用它创建新的DbContext。

我也遇到了同样的问题。我在正常迁移的项目中得到了它。从某个角度看,它开始给我这个错误。问题出在启动项目的选择上。选择一个项目作为启动,在其中配置实体框架作为服务使用


无论如何,我在ASP.Net Core 2.1/EF中遇到了这个错误,因为我的“appsettings.json”中有一个语法错误:

  • 错误的应用程序设置:

    {
      "ConnectionStrings": {
        "DefaultConnection": "\"Server=(LocalDb)\\\\MSSQLLocalDB;Database=demoangulardatabase;",
        "Trusted_Connection=True;MultipleActiveResultSets=true\""
      },
      ...
    
  • “迁移”命令失败:


修复损坏的appsettings.json后,
dotnet ef migrations add initialMigration-c ApplicationDbContext-v
运行良好。

Startup.cs上是否必须添加依赖项注入或更改某些内容?谢谢。@namvo我不认为迁移是这样。这应该是公认的答案,因为它解决了包括我在内的越来越多人的问题;)
{
  "ConnectionStrings": {
    "DefaultConnection": "\"Server=(LocalDb)\\\\MSSQLLocalDB;Database=demoangulardatabase;",
    "Trusted_Connection=True;MultipleActiveResultSets=true\""
  },
  ...
dotnet ef migrations add initialMigration -c ApplicationDbContext -v
...
Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type 'ApplicationDbContext'. 
Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see  https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time. ---> 
System.MissingMethodException: No parameterless constructor defined for this object.
...
"ConnectionStrings": {
  "DefaultConnection": 
    "Server=(LocalDb)\\MSSQLLocalDB;Database=demoangulardatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
},