DbContext と移行構成を生成する T4 テンプレートがあります。実行時に、そのテンプレートを使用してアセンブリを作成し、そのアセンブリを使用して移行を生成します。ただし、データベースの更新を行いたい場合は、プログラムで行います。ただし、エラーが発生します。
指定されたカルチャまたはニュートラル カルチャに適したリソースが見つかりませんでした。コンパイル時に "EFMigrations._11_01_30.resources" がアセンブリ "AutomatedMigrations" に正しく埋め込まれているかリンクされていること、または必要なすべてのサテライト アセンブリが読み込み可能で完全に署名されていることを確認してください。
アセンブリを作成するためのコード:
var configuration = (DbMigrationsConfiguration)icc.CompiledAssembly.CreateInstance("EFMigrations.Configuration");
File.WriteAllText(directory + scaffold.MigrationId + ".designer.cs", scaffold.DesignerCode);
File.WriteAllText(directory + scaffold.MigrationId + ".cs", scaffold.UserCode);
using (var writer = new ResXResourceWriter(directory + scaffold.MigrationId + ".resources"))
{
foreach (var resource in scaffold.Resources)
writer.AddResource(resource.Key, resource.Value);
}
var filesContents = Directory.GetFiles(directory).Where(x => x.EndsWith(".cs")).Select(File.ReadAllText).ToList();
var resources = Directory.GetFiles(directory).Where(x => x.EndsWith(".resources"));
compilerParams.EmbeddedResources.AddRange(resources.ToArray());
var assemblies = provider.CompileAssemblyFromSource(compilerParams, filesContents.ToArray());
configuration.MigrationsAssembly = assemblies.CompiledAssembly;
configuration.MigrationsNamespace = "EFMigrations";
var migrator = new DbMigrator(configuration);
migrator.Update();
Update() 行で例外がスローされます。
アップデート:
その問題を解決するために小さなハックを実行しました (リソースに Namespace.Class.resources という名前を付けましたが、エラーが発生しました:
ストリームは有効なリソース ファイルではありません
更新 2:
別の T4 ランタイム テンプレートを作成し、リソースの値をそこに直接配置することで、この問題を解決しました。これはハックなソリューションですが、私の目的には適しています。ただし、リソース ファイルの動作と、生成されたリソース ファイルが気に入らない理由にまだ悩まされています。