Visual Studio 2017で最新の.NetコアとEFコアを使用しています。モデルを作成しました。私は以来、いくつかの変更を行ったと私は新しい移行を追加しようとすると、次のエラーを取得しています:エンティティフレームワークコア - 移行 - このオブジェクトに対して定義された無パラメータコンストラクタ
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.
私は最後のチェック以来、私のコードを比較しているし、かどうかを確認するために、コードの特定のチャンクをコメントアウトしていますエラーが続き、何かコメントアウトしても、同じエラーで失敗します。
質問:パラメータのないコンストラクタがない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;");
}
...
}
については
私はIDbContextFactory
を持っていますが、それはどこにも参照され、参照することなく働いていません。これが問題であるか2番目のコメントで提供されたリンクに基づいていないかどうかはわかりません。メモリが機能する場合は、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:Solutiuon は私が1で(docs.microsoft.com含む)サイトのトンを読んでいますASP.Netコアを学んでいることを見てポイント私は上記のようにIDbContextFactory
コードを入れた。コードから削除してエラーが解消され、すべてがビルドされ、移行が作成されました。
AlmanacDbFactory
コンストラクタ内でILoggerFactory loggerFactory
の依存関係を取り除くと、トリックも同様に実行されると仮定して(まだテストしていない)回答として@alessalessioをマークします。
移行、モデルまたはDbContext? ;) – Tseng
これを実行している間、 'dotnet ef migrationsはInitialCreationV4 -s .. \ Almanac'を追加します – Grandizer
あなたのコンテキストはどのように見えますか? [this](https://github.com/aspnet/EntityFramework/issues/5294)を参照してください –