【问题标题】:Generating Model code from Model.edmx in EF6 without Visual Studio在没有 Visual Studio 的情况下在 EF6 中从 Model.edmx 生成模型代码
【发布时间】:2014-01-03 16:00:48
【问题描述】:

对于我们的应用程序,我们在构建过程中不使用 Visual Studio; Visual Studio 不在构建服务器上。一般来说,我们一直将 Visual Studio 作为开发应用程序的“必备工具”,但可重现构建的关键要求都是开源/免费提供的。

我现在正在考虑升级到 EF6。我不想签入生成的模型代码,所以我需要一种从 edmx 文件生成模型而不需要 Visual Studio 的方法。

之前,我们使用了 EdmGen,因为它是随 .NET 框架一起提供的,我们很高兴我们的构建服务器依赖于它。在 EF6 中,推荐的生成代码的方法是使用 T4 模板。

但是,T4 代码生成工具内置在 Visual Studio 中,不单独提供。

This question 包含部分答案。但是,这两个答案都存在问题。

首先,建议许可证允许您将必要的文件从 Visual Studio 安装复制到构建服务器。但是,这是一个丑陋的解决方案,因为这意味着无法自动设置新的构建服务器,并且取决于存在的 Visual Studio 安装。此外,对于 EF6 模型生成,我们还需要 Visual Studio 安装中的 EF.Utility.CS.ttinclude。我收到一封来自 Microsoft 开发人员的电子邮件,说在他的非法律意见中,我也可以复制该文件,但查看许可证,我不相信。

其次,更吸引人的是,MonoDevelop 中有 an open-source implementation of TextTransform。但是,同样,我们缺少该包含文件,此外,我不清楚这个 TextTransform 工具的工作方式是否完全相同,并且可以处理 EF6 给我的模板。到目前为止,我在尝试让它工作时遇到了错误。

那么:有没有人有一个不使用只能从 Visual Studio 安装中获得的工具来生成 EF6 模型的工作示例?

【问题讨论】:

  • 解决方案:使用代码优先。
  • 我不确定,但对于 ef 4/5,我们有一个相当短的步骤列表来设置构建服务器。其中一个涉及复制这些文件,但这没什么大不了的,而且 zip 已经准备好了。如果需要,我可以将它们自动化(我认为除了安装 vs 测试工具),但我看不到我们每 30 分钟启动一次构建服务器。
  • @HighCore:我不能使用 CodeFirst,因为这个项目早于 CodeFirst,到目前为止,我从 Edmx 文件迁移到 CodeFirst 类的所有调查似乎都是一项非常大量的工作,因为我们的模型尺寸。但是,是的,我同意 CodeFirst 是一种更理想的做事方式。
  • @AndrewBacker:问题是,我们还将源代码分发给我们的客户。当时的想法是,如果我们作为一家公司破产,他们已经拥有并拥有构建和运行应用程序所需的所有文件。如果这个 zip 文件变得必要,我该怎么处理它?我不能将它与其他所有东西一起保存在源存储库中,因为从法律上讲,这算作将它重新分发给我们的客户。我想我可以编写一个脚本,当在带有 Visual Studio 的机器上运行时,它会为您生成一个用于设置构建服务器的存档……但这不是一个很好的解决方案。
  • @Martin Edin:啊,我明白了。所以这并不是真正关于构建服务器,而是关于捆绑一个工具,以便他们可以在不依赖 VS 的情况下生成代码。构建服务器是一个很好的副作用。很酷。但是为什么你对包含 vs 工具输出感到过敏呢?我可以从哲学上理解......但我认为这不会是许可证问题。太糟糕了。我想知道自己的解决方案。然后让我们摆脱 VsTest :)

标签: c# mono monodevelop t4 entity-framework-6


【解决方案1】:

我现在有这个工作。我完成的解决方案是使用 MonoDevelop 的the open-source implementation of TextTransform。事实证明,实体框架创建的 tt 模板使用的模板包含文件也可以在开放许可证下使用。可从here 获得它们。

为了让它与 Visual Studio 创建的模板一起工作,我必须进行一些更改。

在 Model.tt 中,我必须删除 #if PREPROCESSED_TEMPLATE 签入 GetNamespaceName

其次,我必须对包含文件进行一些小的修改。修改后的完整文件为here

您需要自己执行此操作的所有文件都在that repository 中,但请注意,我不保证我在其中包含的 TextTransform 的二进制文件是最新的 - 您可能应该自己构建/获取它们脱离 MonoDevelop 安装。只需添加一个 Model.tt 文件,然后使用以下命令调用:

./TextTransform.exe -out Models.cs -I INCLUDES Model.tt

其中“INCLUDES”是修改后的 EF.Utility.CS.ttinclude 所在的文件夹。

【讨论】:

  • 您是如何让 TT 对 EdmGen 输出运行的,该输出转至单独的文件而不是 Edmx?或者您是否使用库来组合它们?你发现 VS 和 EdmGen 生成的元数据有什么区别吗?我也一直在努力让它工作,并且它的文档非常少,特别是作为端到端解决方案,包括类文件等。如果你能写更多关于它的内容,那就太好了。
  • @CodyKonior:我不再有权访问代码,但我记得,我根本不再使用 EdmGen。我只是在由 Visual Studio 从 Edmx 文件创建的 Model.tt 文件上运行 TextTransform。输出就是那个单一的 Model.cs 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多