实体框架核心 - 迁移 - 没有为此对象定义的无参数构造函数

Gra*_*zer 7 c# entity-framework entity-framework-core asp.net-core

我正在使用Visual Studio 2017中最新的.Net Core和EF Core.我创建了一个模型,它运行良好.我已经做了一些修改,并在尝试添加新迁移时收到以下错误:

Build succeeded.
  0 Warning(s)
  0 Error(s)

Time Elapsed 00:00:09.08
System.MissingMethodException: No parameterless constructor defined for this object.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)
  at System.Activator.CreateInstance(Type type)
  at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_0.<FindContextTypes>b__3()
  at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
  at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
  at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
  at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
  at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
  at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
No parameterless constructor defined for this object.
Run Code Online (Sandbox Code Playgroud)

我已经比较了自上次检入以来的代码并且已经注释掉了某些代码块以查看错误是否仍然存在以及我注释掉了什么,它仍然会出现相同的错误.

问题:有没有办法获得有关WHAT类型没有无参数构造函数的更详细信息?或者甚至从VS中运行它并且可能得到一个断点?

更新:基于一些评论,这里是一些代码.

对于DbContext覆盖

public class AlmanacDb : IdentityDbContext<ApplicationUser, ApplicationRole, int> {

  private readonly ILogger logger;

  public AlmanacDb(DbContextOptions<AlmanacDb> options, ILoggerFactory loggerFactory) : base(options) {
    this.logger = loggerFactory.CreateLogger<AlmanacDb>();
  }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
    optionsBuilder.UseSqlServer("Server=.\\SQLExpress;Database=Almanac;Trusted_Connection=True;MultipleActiveResultSets=True;");
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

我确实有,IDbContextFactory但它没有在任何地方引用,没有参考工作.根据第二条评论中提供的链接,不确定这是否存在问题.如果内存服务,只要IDbContextFactory在解决方案内,它应该找到它?

public class AlmanacDbFactory : IDbContextFactory<AlmanacDb> {

  private IConfigurationRoot configuration;
  private readonly ILoggerFactory loggerFactory;

  public AlmanacDbFactory(ILoggerFactory loggerFactory) {
    var builder = new ConfigurationBuilder()
     .SetBasePath(System.AppContext.BaseDirectory)
     .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

    this.configuration = builder.Build();
    this.loggerFactory = loggerFactory;
  }

  public AlmanacDb Create(DbContextFactoryOptions options) {
    var optionsBuilder = new DbContextOptionsBuilder<AlmanacDb>();
    optionsBuilder.UseSqlServer(
      configuration.GetConnectionString("AlmanacSQL"), m => { m.EnableRetryOnFailure(); }
    );

    return new AlmanacDb(optionsBuilder.Options, loggerFactory);
  }
}
Run Code Online (Sandbox Code Playgroud)

我的Startup.cs班级

public void ConfigureServices(IServiceCollection services) {
  try {
    services.AddDbContext<AlmanacDb>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("AlmanacSQL"))
    );
    services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

    services.AddIdentity<ApplicationUser, ApplicationRole>()
      .AddEntityFrameworkStores<AlmanacDb, int>()
      .AddDefaultTokenProviders();

    services.AddScoped<SignInManager<ApplicationUser>, AvantiaSignInManager<ApplicationUser>>();

    services.AddAuthorization(x => {
      x.AddPolicy("EmployeeOnly", p => p.RequireClaim("EmployeeNumber"));
    });

    services.AddMvc();
  } catch (Exception e) {
    Console.WriteLine(e.ToString());
    throw;
  }
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AlmanacDb context) {
  ... // Nothing actually touches the AlmanacDb within this code so I left it out
}
Run Code Online (Sandbox Code Playgroud)

更新2:Solutiuon 看到我正在学习ASP.Net Core我正在阅读大量网站(包括docs.microsoft.com),我在上面的IDbContextFactory代码中输入了一些内容.我从我的代码中删除了它,错误消失了,所有内容都构建并创建了迁移.

我打算将@alessalessio标记为答案,因为我假设(还没有测试过)ILoggerFactory loggerFactoryAlmanacDbFactory构造函数中取出依赖项也可以.

ale*_*sio 8

设计时工具尝试自动查找应用程序如何创建DbContext类型的实例.如果EF无法找到初始化DbContext的合适方法,则可能会遇到此错误.

选项:1-创建无参数构造函数

  public AlmanacDb() { }
  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {           
       optionsBuilder.UseSqlServer(_connString);
  }

  private readonly string _connString = "<your conn string>";
Run Code Online (Sandbox Code Playgroud)

2-

public AlmanacDb Create()
{
     var optionsBuilder = new DbContextOptionsBuilder<AlmanacDb>();
     optionsBuilder.UseSqlServer(connectionString);

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

https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

  • 为什么你的选项1变得少参数?它不包含一个参数`DbContextOptions <AlmanacDb> options`? (2认同)
  • 我有类似的问题。但解决方式不同。使用 -v 运行迁移揭示了确切的问题,“dotnet ef -v migrations add”在输出中我发现“在类“Program”上找不到静态方法“CreateHostBuilder(string[])”。”我重命名了 CreateHostBuilder由于一些其他原因。我将其恢复到 CreateHostBuilder 并且它开始工作! (2认同)