entity-framework - 使用 MSBuild 构建 Entity Framework 模型而不使用项目文件?

标签 entity-framework deployment msbuild compilation msbuild-task

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

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

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

请注意

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

更新

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

最佳答案

我今天实际上处理了这个问题,因为我的项目的源树没有正确设置来运行 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;

注意我告诉 Entity Framework 这些文件与我的 dll 位于同一目录中,而不是作为资源嵌入。

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

希望这可以帮助。

关于entity-framework - 使用 MSBuild 构建 Entity Framework 模型而不使用项目文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173298/

相关文章:

asp.net - 使用IIs6或IIs7的命令行在IIS中更改虚拟目录或站点的物理路径

msbuild - 为什么 MSBuild 在 Visual Studio 重建期间突然说我的 <Target> 没有输出?

c# - Entity Framework 实体类与普通 .NET 类的映射

entity-framework - EF 迁移声称上下文发生了变化,但实际上没有

entity-framework - 与 OneWay CascadeOnDelete 的一对一或零关系

TFS 使用 MSBuild 添加文件

.net - msbuild .targets 文件中 ItemGroup 项的相对路径

c# - EF4.0 中的延迟加载正在卡住 UI

java - Netbeans GlassFish Server 4,部署,连接被拒绝 : connect, false ,模块尚未部署。有关详细信息,请参阅服务器日志

java - 如何创建一个在我的应用程序运行时一直运行的线程