我的目标是使用预构建脚本根据编译器配置(调试/发布/其他..)更改架构。
我看到有许多解决方案可以使用代码在运行时更改架构,我采用了另一种方法,使用预构建脚本来更改 edmx 文件。这不起作用,我想知道为什么这不起作用(我并不是在寻找更好/不同的方法。)
我的方法是这样的:在预构建事件中,我添加了一个脚本来更改 edmx 文件,将字符串 Schema="dbo" 更改为 Schema="dbo2"。
在构建后事件中,我添加了一个脚本来返回文件(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 在脚本运行之前所拥有的任何内容。
如果完全删除 postbuild 脚本(认为 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 文件或其他代码生成事件?