2017-04-19 10 views
2

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をマークします。

+0

移行、モデルまたはDbContext? ;) – Tseng

+0

これを実行している間、 'dotnet ef migrationsはInitialCreationV4 -s .. \ Almanac'を追加します – Grandizer

+0

あなたのコンテキストはどのように見えますか? [this](https://github.com/aspnet/EntityFramework/issues/5294)を参照してください –

答えて

5

デザイン時ツールは、アプリケーションが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://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

+1

オプション1はどのようにパラメータが少なくなるのですか? 1つのパラメータ 'DbContextOptions options'は含まれていませんか? – shashwat

+0

私の悪い、それを指摘してくれてありがとう – alessalessio

関連する問題