使用MSBuild构建实体框架模型而不使用项目文件?

时间:2010-01-31 20:57:17

标签: entity-framework deployment msbuild compilation msbuild-task

我正在为一个相当大的项目构建一个脚本。其中一个项目需要将实体框架模型编译到库中。由于构建服务器的工作方式,所有构建都是手工制作的,以管理各种部署方案,而不会影响开发人员和项目文件。

无论如何使用MSBuild任务生成EF模型而不使用Visual Studio生成的项目文件?目前,实际程序集使用CSC任务进行编译,但实际部署的应用程序失败,因为EF模型未包含在已编译的程序集中。

可以使用Targets或Build Tasks生成模型并创建嵌入程序集所需资源的任何指针?

请注意

项目在Visual Studio中编译得很好,但是在构建服务器上使用项目文件不是一个选项,因为在部署时需要对项目进行各种更改,这是通过自定义构建来控制的开发团队控制之外的脚本。这对于一些项目来说是成功的,但EF模型在这种特定情况下引起了一些令人头疼的问题。

更新

目前的解决方案并不理想但有效。已修改Project文件以将EF Model资源复制到项目中的新版本构建中的文件夹,然后将其检入源代码管理。当构建脚本在服务器上运行时,EF模型将嵌入到程序集中。目前这似乎是一个可行的解决方法。

2 个答案:

答案 0 :(得分:4)

我今天实际处理了这个问题,因为我的项目的源代码树没有正确设置来运行Entity Framework的构建任务,该任务生成并在输出dll中嵌入资源。

我调查了以下选项:

使用EntityDeploy msbuild任务

如果您在记事本中打开.csproj文件,您应该会看到一些像

这样的XML
 <EntityDeploy Include="MyEntities.edmx">
  <Generator>EntityModelCodeGenerator</Generator>
  <LastGenOutput>MyEntities.Designer.cs</LastGenOutput>
 </EntityDeploy>

这是msbuild任务,它使用 Microsoft.Data.Entities.Build.targets Microsoft.Data.Entities.Build.dll 来读取edmx文件,生成ssdl,csdl和msl文件然后将它们嵌入目标dll中。 (这些文件可以在 C:\ Windows \ Microsoft.NET \ Framework \ v3.5 中找到)。

使用EdmGen

正如克雷格指出的那样,您可以使用框架附带的EdmGen.exe。我给了一个去,但我已经对我的edmx文件中的数据进行了一些自定义,并且EdmGen.exe似乎真的想要从原始数据库进行初始生成。

使用EdmGen2

EdmGen2.exe是一个开源项目,比EdmGen做得更多。我最终用它来生成ssdl,csdl和msl文件。您可以将它指向您的edmx文件,它将生成必要的ssdl,csdl和msl文件。然后我将这些包含在我的dll旁边并修改了

中的连接字符串
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl;

注意我告诉实体框架这些文件与我的dll在同一目录中,而不是作为资源嵌入。

所有这三个,构建任务,EdmGen和EdmGen2都是瘦包装器,它们为所有硬件调用System.Data.Entity.dll。作为最后的手段,您可以查看反射器中的构建任务dll并查看它正在做什么。

希望这有帮助。

答案 1 :(得分:1)

是的,有一个名为EdmGen的命令行实用程序可以执行此操作。使用EdmGen /?进行可能的切换。