私が解決したい問題は、ビルド構成に応じて異なるスクリプトをビルドすることです。
SQL Server の 2 つのインスタンスがあるとします。
- リンクサーバーが接続されたエンタープライズ版
- オフライン開発および単体テスト用の LocalDb バージョン
エンタープライズ バージョンには、LocalDB がこれらのビューをローカル テーブルに置き換えるときに、リンクされたサーバーのビューがあります。
これらのリンク サーバー ビューとローカル テーブルは、同じ名前と一連のフィールドを持ちます。そのため、デフォルトではビルドに含まれません (ビルド アクション = なし)。代わりに、プロジェクト ファイルの BeforeBuild ターゲットのビルドに含まれます。
<Target Name="BeforeBuild">
<ItemGroup Condition=" '$(Configuration)' == 'LocalDb'">
<Build Include="Local_Tables\*.sql" />
</ItemGroup>
<ItemGroup Condition=" '$(Configuration)' != 'LocalDb' ">
<Build Include="Linked_Server_Views\*.sql" />
</ItemGroup>
</Target>
しかし、問題は、Visual Studio が DB モデルをキャッシュすることです。最初に LocalDb 用のプロジェクトをビルドしてから、Enterprise 構成用のプロジェクトをビルドしようとすると、Visual Studio はエラーを出力します。
エラー: SQL71508: モデルには既に同じ名前の要素があります
ソリューションを閉じて開くか、プロジェクトをアンロードしてプロジェクトを再ロードすると、Visual Studio は dbmdl ファイルを再作成し、エンタープライズ構成はエラーなしでビルドされます。
したがって、dbmdl キャッシュを更新すると、エラーなしでスムーズにビルドできると思います。
Visual Studio 2012 で SQL Server データベース プロジェクトを開くか再読み込みすると、拡張子dbmdlのファイルが作成されます。これは、ここで説明されているように、逆シリアル化されキャッシュされた db モデルです。
dbmdl ファイルの再作成の瞬間に、Visual Studio は次のように出力します。
Deserializing the project state for project 'MyProject.sqlproj'...
Detecting file changes for project 'MyProject.sqlproj'...
Deserialization has been completed for project 'MyProject.sqlproj'.
プロジェクトをリロードせず、プロジェクト xml ファイルを変更せずに、Visual Studio に強制的に dbmdl キャッシュを更新させる方法は?
プロジェクト xml ファイルの BeforeBuild または AfterBuild ターゲットにコマンドを配置して、dbmdl キャッシュを更新する方法はありますか?
または、問題へのアプローチ全体が間違っていて、ビルド構成に応じて異なるスクリプトを作成する別の方法がありますか?