EFコアデータシードのためのドットネットツールを作成する

asp.net-core dotnet-cli entity-framework-core

質問

この記事で述べたように、私はASP.NET Coreプロジェクトの起動時のデータベースデータを次のようにしています:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {

  using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) {  
    var context = serviceScope.ServiceProvider.GetService<MyContext>();       
    context.Database.Migrate();
    context.EnsureSeedData();

  }

}

しかし、同じ投稿では、データを手動でシードすることも推奨されています。

複数のサーバーが存在する場合の競合状態や意図しない変更を避けるため、一般的にこれらの操作を手動で適用することをお勧めします(移行を実行して起動時に自動的にシードするのではなく)。

これは私が好むと、次のようにドットネットツールを使用しています:

dotnet seed -c <Context> -s <SeedData>

ここで:
- Contextは、使用されるDbContextです。指定されていない場合、デフォルトが使用されます。
- SeedDataは、データ挿入ロジックを含むクラスです。

このようなカスタムドットネットツールを作成することは可能ですか?

ツール内でDbContextを使用できますか?

受け入れられた回答

プロジェクトのアセンブリをロードする汎用のdotnet CLIツールを作成することは自明ではありません。

aspnet / EntityFramework.Toolsaspnet / EntityFramework reposで掘り出し始めることができます。一般的なプロセスフローは次のとおりです。

  1. dotnet呼び出すdotnet-ef.dll
  2. dotnet-efはMSBuildを介してプロジェクトに関する情報(ターゲットフレームワークとランタイムアーキテクチャなど)をef.exe (またはdotnet ef.dll )を呼び出して、
  3. ef.exeは、 Microsoft.EntityFrameworkCore.Design.dllとプロジェクトアセンブリ( AppDomainまたはReflection経由)を読み込み、 OperationExecutorを呼び出します
  4. Microsoft.EntityFrameworkCore.DesignDbContextをインスタンス化し、そのDbContextを実行します。

プロジェクトを汎用性が低く、プロジェクト固有のものにすることで、これを劇的に簡素化できます。さらに、 dotnetツールの代わりにコンソールアプリケーションを作成するだけで



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ