私の目標は、ビルド前のスクリプトを使用して、コンパイラの構成 (デバッグ/リリース/その他..) に応じてスキーマを変更することです。
コードを使用して実行時にスキーマを変更するソリューションがいくつかあることがわかりました。ビルド前のスクリプトを使用して edmx ファイルを変更する別の方法を採用しました。これは機能していません。なぜこれが機能しないのか疑問に思っています (私は、より良い/別のアプローチを探しているわけではありません)。
私のアプローチは次のとおりです。ビルド前のイベントで、文字列 Schema="dbo" を Schema="dbo2" に変更して edmx ファイルを変更するスクリプトを追加しました。
ビルド後のイベントで、ファイルを返すスクリプトを追加しました (Schema="dbo2" から Schema="dbo" へ)。
また、コンパイラ構成を処理する条件を設定しました。
if $(ConfigurationName) == Release
したがって、次のようになります。
ビルド前:if $(ConfigurationName) == Release setdbo2.bat
ポストビルド:if $(ConfigurationName) == Release setdbo.bat
また、edmxファイルの内容をbatファイルにダンプしてみました。ビルド前のスクリプトが edmx ファイルのスキーマを正しく変更し、ビルド後のスクリプトがそれを正しく元に戻すことを確信しています。私が経験しているバグは、スキーマの変更をビルドすると、結果のアセンブリに反映されないことです (ビルド前のスクリプトがないかのように動作します)。ビルド前のスクリプトが実行されていることはわかっており、これはビルドの出力から確認できます。
1> Completed setdbo2.bat
~~ **snip** ~~
Various stupid compiler warnings
~~ **/snip** ~~
1> myProject -> C:\myProject\bin\myProject.dll
1> Completed setdbo.bat
切り取りの前に、edmx ファイルを出力画面にダンプすると、実際に edmx ファイルが期待どおりに変更されていることがわかります。ただし、アセンブリ内に含まれる myProjectDMO.ssdl ファイルには、スクリプトの実行前に edmx が持っていたものが含まれています。
ビルド後のスクリプトを完全に削除した場合 (コンパイル後に ssdl が生成/追加される可能性があると考えて)、ssdl も影響を受けません。
そのため、ビルド前のスクリプトが実行される前にssdlファイルが生成されるようです。
これが事実であるかどうか誰かが知っていますか?もしそうなら、これに対処するためのある種のプレビルドスクリプトがありますか?
- 詳しくは -
出力ビルド ウィンドウの冗長性を設定できることがわかりました。そこから私はこれを得ることができました:
1>------ Build started: Project: myProject, Configuration: Release Any CPU ------
1>Build started 6/4/2015 4:06:23 PM.
1>EntityDeployNonEmbeddedResources:
1>Skipping target "EntityDeployNonEmbeddedResources" because it has no outputs.
1>EntityDeployEmbeddedResources:
1> Processing 1 EDMX files.
1> Starting to process input file 'myProjectDMO.edmx'.
1> Finished processing input file 'myProjectDMO.edmx'.
1> Finished processing 1 EDMX files.
1>PreBuildEvent:
1> if Release == Release setdbo2.bat
edmx ファイルは、ビルド前イベントの前に処理されます。この問題は、ファイルのメモリ内キャッシュに関連していないようです。
質問は、ビルド前のスクリプトはありますか? それとも、tt ファイルやその他のコード生成イベントをいじり始める必要がありますか?