2

我的目标是使用预构建脚本根据编译器配置(调试/发布/其他..)更改架构。

我看到有许多解决方案可以使用代码在运行时更改架构,我采用了另一种方法,使用预构建脚本来更改 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 文件或其他代码生成事件?

4

1 回答 1

1

A解决方案 编辑文件"obj\Release\edmxResourcesToEmbed\myProjectDMO.ssdl"而不是edmx。

我相信互联网上的某个人可以找到不这样做的充分理由,但这似乎确实有效。Visual Studios 可能应该构建更多的钩子来避免这样的黑客攻击。

在 Projects > Build Events > Pre-build event 命令行下

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 回答