3

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 ランタイム テンプレートを作成し、リソースの値をそこに直接配置することで、この問題を解決しました。これはハックなソリューションですが、私の目的には適しています。ただし、リソース ファイルの動作と、生成されたリソース ファイルが気に入らない理由にまだ悩まされています。

4

1 に答える 1

2

これを回答済みとしてマークするために、デザイナーコードのサンプルをベースとして使用し、MigrationMetadataID と Target に次のような足場リソースからのものを入力する別の t4 ジェネレーターを作成することで、特定の問題を解決しました。

var designerGenerator = new MigrationDesignerGenerator();
designerGenerator.Session = new Dictionary<string, object>();
designerGenerator.Session.Add("Target", scaffold.Resources["Target"]);
designerGenerator.Session.Add("MigrationId", scaffold.MigrationId);
designerGenerator.Initialize();
File.WriteAllText(directory + scaffold.MigrationId + ".Designer.cs", designerGenerator.TransformText());

メタデータ ジェネレーターから ResourceManager フィールドを除外し、代わりにこれをターゲットとして使用しました。

string IMigrationMetadata.Target
{
    get { return "<#= Target #>"; }
}

私は Resx ファイルの問題を解決するまでには至っていませんが、今のところは忘れます。

于 2014-01-30T10:46:48.777 に答える