web-dev-qa-db-ja.com

EF Core Add Migration Debugging

ブレークポイントを使用してOnModelCreatingにステップインし、ロジックが間違っているかどうか、またはModelBuilderが予期しないことを行っているかどうかを確認するにはどうすればよいですか?実際の移行をデバッグする方法については多くの投稿を見てきましたが、モデルコードがどのように生成されているかを監視する方法については何もありません。

一部のエンティティにいくつかのカスタム属性を実装しようとしていますが、無視されています。モデルコードを生成しているときに、構成が何をしているのかを確認したいと思います。

18
Jeremy Holovacs

コードでDebugger.Launch()を呼び出すことができるはずです。ジャストインタイムデバッガーは、その行に到達したときにデバッガーをアタッチするように要求する必要があります。

41
bricelam

別の方法は、独自のコンソールアプリまたは単体テストを作成し、それをデバッグすることです。 bricelamによるこのスニペットを使用してください ef githubの問題から

using (var db = new MyDbContext())
{
    var reporter = new OperationReporter(
        new OperationReportHandler(
            m => Console.WriteLine("  error: " + m),
            m => Console.WriteLine("   warn: " + m),
            m => Console.WriteLine("   info: " + m),
            m => Console.WriteLine("verbose: " + m)));

    var designTimeServices = new ServiceCollection()
        .AddSingleton(db.GetService<IHistoryRepository>())
        .AddSingleton(db.GetService<IMigrationsIdGenerator>())
        .AddSingleton(db.GetService<IMigrationsModelDiffer>())
        .AddSingleton(db.GetService<IMigrationsAssembly>())
        .AddSingleton(db.Model)
        .AddSingleton(db.GetService<ICurrentDbContext>())
        .AddSingleton(db.GetService<IDatabaseProvider>())
        .AddSingleton<MigrationsCodeGeneratorDependencies>()
        .AddSingleton<ICSharpHelper, CSharpHelper>()
        .AddSingleton<CSharpMigrationOperationGeneratorDependencies>()
        .AddSingleton<ICSharpMigrationOperationGenerator, CSharpMigrationOperationGenerator>()
        .AddSingleton<CSharpSnapshotGeneratorDependencies>()
        .AddSingleton<ICSharpSnapshotGenerator, CSharpSnapshotGenerator>()
        .AddSingleton<CSharpMigrationsGeneratorDependencies>()
        .AddSingleton<IMigrationsCodeGenerator, CSharpMigrationsGenerator>()
        .AddSingleton<IOperationReporter>(reporter)
        .AddSingleton<MigrationsScaffolderDependencies>()
        .AddSingleton<MigrationsScaffolder>()
        .BuildServiceProvider();

    var scaffolder = designTimeServices.GetRequiredService<MigrationsScaffolder>();

    var migration = scaffolder.ScaffoldMigration(
        "MyMigration",
        "MyApp.Data");

    File.WriteAllText(
        migration.MigrationId + migration.FileExtension,
        migration.MigrationCode);
    File.WriteAllText(
        migration.MigrationId + ".Designer" + migration.FileExtension,
        migration.MetadataCode);
    File.WriteAllText(migration.SnapshotName + migration.FileExtension,
        migration.SnapshotCode);
}
0
Tedy Pranolo