2

私の目標は、ビルド前のスクリプトを使用して、コンパイラの構成 (デバッグ/リリース/その他..) に応じてスキーマを変更することです。

コードを使用して実行時にスキーマを変更するソリューションがいくつかあることがわかりました。ビルド前のスクリプトを使用して 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 ファイルやその他のコード生成イベントをいじり始める必要がありますか?

4

1 に答える 1

1

A"obj\Release\edmxResourcesToEmbed\myProjectDMO.ssdl"解決策は、edmx の代わりにファイルを編集することです。

インターネット上の誰かがそうしない正当な理由を見つけることができると確信していますが、これはうまくいくようです. Visual Studio は、このようなハッキングを回避するために、おそらくさらにいくつかのフックを組み込む必要があります。

[プロジェクト] > [ビルド イベント] > [ビルド前のイベント コマンド ライン] の下

if $(ConfigurationName) == Release launchSED.bat

launchSED.bat は cygwin を起動し、次に実行します

find ./ -type f -exec sed -i 's/dbo/NewSchema/' {} \;

それは素晴らしい答えではありません。Cygwinが必要なので。Windows用のカスタムsedコマンドも作成しました。このプログラムは、ファイル パス、置換する文字列、文字列を置き換える文字列の 3 つの入力を受け取ります。

winsed obj\Release\edmxResourcesToEmbed\myDMOFile.ssdl "Schema=""dbo""" "Schema=""NewSchema"""
于 2015-06-04T23:46:08.963 に答える