5

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

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

任何指向哪些目标或构建任务可用于生成模型并创建所需资源以嵌入到程序集中的指针?

请注意

该项目在 Visual Studio 中编译得很好,但是不能在构建服务器上使用项目文件,因为在部署时需要对项目进行各种更改,这可以通过外部的自定义构建脚本进行控制开发团队控制。这对一些项目来说是成功的,但是 EF 模型在这个特定的场景中引起了一些麻烦。

更新

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

4

2 回答 2

4

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

我调查了以下选项:

使用 EntityDeploy msbuild 任务

如果你在记事本中打开你的 .csproj 文件,你应该会看到一些类似的 XML

 <EntityDeploy Include="MyEntities.edmx">
  <Generator>EntityModelCodeGenerator</Generator>
  <LastGenOutput>MyEntities.Designer.cs</LastGenOutput>
 </EntityDeploy>

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

使用 EdmGen

正如 Craig 指出的那样,您也许可以使用框架附带的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 并查看它在做什么。

希望这可以帮助。

于 2010-02-03T07:37:28.020 回答
1

是的,有一个名为的命令行实用程序EdmGen可以做到这一点。用于EdmGen /?可能的开关。

于 2010-02-01T14:01:21.443 回答