我在 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.
我比较了自上次 checkin 以来的代码,并注释掉了某些代码块,以查看错误是否仍然存在,无论我注释掉什么,它仍然失败并出现相同的错误。
问题:有没有办法获得更多关于什么类型没有无参数构造函数的详细信息?或者甚至从 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;");
}
...
}
我确实有一个 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);
}
}
我的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
}
更新 2:解决方案
看到我正在学习 ASP.Net Core 我正在阅读大量网站(包括 learn.microsoft.com),我在一个点上输入了 IDbContextFactory
代码,如上所示。我从我的代码中删除了它,错误消失了,一切都构建并创建了迁移。
我打算将@alessalessio 标记为答案,因为我假设(还没有测试过)在 AlmanacDbFactory
构造函数中取出 ILoggerFactory loggerFactory
依赖项就可以了技巧也是如此。
最佳答案
设计时工具会尝试自动查找您的应用程序如何创建 DbContext 类型的实例。如果 EF 找不到合适的方法来初始化您的 DbContext,您可能会遇到此错误。
选项: 1-要么创建一个无参数的构造函数
public AlmanacDb() { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connString);
}
private readonly string _connString = "<your conn string>";
2-
public AlmanacDb Create()
{
var optionsBuilder = new DbContextOptionsBuilder<AlmanacDb>();
optionsBuilder.UseSqlServer(connectionString);
return new AlmanacDb(optionsBuilder.Options);
}
https://learn.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
关于c# - Entity Framework Core - 迁移 - 没有为此对象定义无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43501023/