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

时间:2017-04-20 03:38:30

标签: c# asp.net entity-framework

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

    <Project Sdk="Microsoft.NET.Sdk">    
      <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
      </PropertyGroup>    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
        <ProjectReference Include="..\Butv.Core\Butv.Core.csproj" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" PrivateAssets="All" />      
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.0.0" />    
      </ItemGroup>
      <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />  
      </ItemGroup>
      <ItemGroup>
        <Folder Include="Migrations\" />
      </ItemGroup>
    </Project>

db Context:

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

     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {  ....
     }
}
public class ApplicationUser : IdentityUser
{
}

每次我尝试命令

  

dotnet ef迁移添加Init --verbose

,我收到错误。在将Data项目与主项目分开之前,它已经习惯了。

  

Microsoft.EntityFrameworkCore.Design.OperationException:无无参数构造   uctor在'ApplicationDbContext'上找到。添加无参数构造   转到'ApplicationDbContext'或在'ApplicationDbContext'的同一程序集中添加'IDbContextFactory'的实现。 ---&GT; System.Mi   ssingMethodException:没有为此对象定义的无参数构造函数。      在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值publicOn   ly,Boolean noCheck,Boolean&amp; canBeCached,RuntimeMethodHandleInternal&amp; ctor,Bo   奥利安和放大器; bNeedSecurityCheck)

3 个答案:

答案 0 :(得分:11)

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

This can help

答案 1 :(得分:2)

这与错误说的完全一样。您需要在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);
    }
}

请注意,您必须创建一个DbContextOptionsBuilder才能传递给DbContext,但是由于迁移实际上并未访问数据库而只是读取您的实体类,我认为您不需要实际配置任何选项,除了可能的数据库提供程序,因为我遇到了生成的迁移代码问题,这些问题适用于一个提供程序而不是另一个提供程序。

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

答案 2 :(得分:0)

无论如何,由于“ appsettings.json”中的语法错误,我在ASP.Net Core 2.1 / EF中遇到此错误:

  • 不良设置:

    {
      "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.
    ...
    
  • 更正了appsettings.json:

    "ConnectionStrings": {
      "DefaultConnection": 
        "Server=(LocalDb)\\MSSQLLocalDB;Database=demoangulardatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
    

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