我要解决的问题是根据构建配置构建不同的脚本。
假设我们有两个 SQL Server 实例:
- 带有连接的链接服务器的企业版
- 用于离线开发和单元测试的 LocalDb 版本
当 LocalDB 用本地表替换这些视图时,企业版具有链接服务器的视图。
那些链接服务器视图和本地表具有相同的名称和字段集。因此默认情况下它们不包含在构建中(构建操作 = 无)。相反,它们包含在项目文件的 BeforeBuild Target 中的构建中。
<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 构建项目,然后尝试为企业配置构建项目 - Visual Studio 输出错误:
错误:SQL71508:模型已经有一个同名的元素
如果要关闭并打开解决方案或卸载项目并重新加载项目,Visual Studio 将重新创建 dbmdl 文件,并且正在构建企业配置而不会出现错误。
所以我的假设是如果我刷新 dbmdl 缓存,我会顺利构建而不会出错。
当您在 Visual Studio 2012 中打开或重新加载 SQL Server 数据库项目时,它会创建一个扩展名为dbmdl的文件,这是一个反序列化和缓存的数据库模型,如此处所述。
在重新创建 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'.
如何强制 Visual Studio 在不重新加载项目且不更改项目 xml 文件的情况下刷新 dbmdl 缓存?
有没有办法刷新 dbmdl 缓存,将命令放入项目 xml 文件的 BeforeBuild 或 AfterBuild 目标?
或者解决问题的整个方法是错误的,还有另一种方法可以根据构建配置构建不同的脚本?