【问题标题】:How to generate Entity Framework 6.x POCO classes with mappings from an EDMX file?如何使用 EDMX 文件的映射生成 Entity Framework 6.x POCO 类?
【发布时间】:2014-12-10 16:12:47
【问题描述】:

我正在将一个广泛的 EDMX 模型转换为 POCO 类。我需要从数据库优先方法(带有 ObjectContext 的 EDMX)到纯模型优先方法(没有 EDMX 文件的 DbContext)。我需要使用最新的实体框架稳定版本:6.1.1。

我已经测试了一些方法:

  • 通过右键单击 EDMX 设计器中的空白区域添加 EF 6.x DbContext Generator 代码生成项。这工作正常,但它不添加任何映射。使用这种方法,我仍然必须使用 EDMX 文件。这不是完整的 Code First。
  • 使用EF 5.x DbContext Fluent Generator for C#。这会在设计时触发异常。我无法使用它。我不知道是不是因为我的 VS Entity Framework 工具已经更新到 6.x。在 cmets 中使用替代 TT,这表明它可以与 EF 6.0 一起使用也无济于事。
  • 使用EntityFramework Reverse POCO Generator。这是最糟糕的,因为它不会考虑我的任何类和导航属性重命名。
  • 使用Entity Framework Power Tools Beta 4。同样,它只支持从数据库生成,不支持从 EDMX 文件生成。

我的要求:

  • 我需要输入 EDMX 文件,而不是数据库。
  • 我需要输出是具有 Fluent 映射的完整 Code First 方法。
  • 我需要考虑在 EDMX 中定义的所有导航属性名称,否则它会破坏大型代码库,甚至从 ObjectContext 迁移到 DbContext 会破坏。

你觉得我去哪里比较好?

【问题讨论】:

  • Visual Studio 中的实体框架电动工具扩展,visualstudiogallery.msdn.microsoft.com/…
  • 谢谢@dotctor,但 Entity Framework Power Tools 不支持从 EDMX 文件生成 POCO 和映射,只能从数据库服务器生成。
  • 您可以从您的 edmx 生成一个虚拟数据库,然后对其进行逆向工程以生成您的 pocos
  • @dotctor,我不能,因为无法从数据库中推断出反向导航属性名称。相信我,模型很大。但我感谢您尝试提供帮助。
  • 我很确定我以前见过这个问题并且答案一直是“不”。显而易见的第一步是首先迁移到DbContext。这可能会让您有些头疼,但是您可以享受更好的 API 带来的所有好处。作为下一步,您可以考虑引入逐渐接管部分旧上下文的有界代码优先上下文。当模型“巨大”时,拥有几个较小的上下文可能是个好主意。

标签: c# .net entity-framework


【解决方案1】:

好吧,我认为没有简单的一键式解决方案。

在你的 edmx 文件下面。除了 xx.Designer.csxx.edmx.diagram.. 之外,您还有两个可用的文件,称为 xx.Context.ttxx.tt,其中 xx 是您的 edmx 模型的名称。

这些是生成 dbcontext 和 poco 对象的 t4 模板。您的所有 poco 对象都将在您的 xx.tt 文件下创建,dbcontext 在您的 xx.Context.tt 文件下创建。

您现在必须将它们移动到单独的文件中。如果您使用的是 EF6,这会容易得多。并且生成的文件已经在使用 DbContext 而不是 ObjectContext。

【讨论】:

  • 谢谢,但我仍然需要 EDMX,而且我不会有流畅的映射。我需要摆脱 EDMX 并通过代码完成所有映射。
  • 好吧,如果你从 tt 模板下面复制生成的 .cs 文件..你不再需要你的 edmx 了..并且流利的映射已经存在于你生成的上下文文件中..跨度>
  • 它们不存在.. 映射未翻译成 C# 文件。它们仍然保存在 EDMX 文件中,这就是连接字符串是 EF 的原因,而不是标准的 SQL Server 的原因。这是因为实际的映射仍在 EDMX 文件中。
  • 检查您在 edmx 文件中设置的代码生成策略。更多信息在这里msdn.microsoft.com/en-us/library/vstudio/…
  • 它是 T4,它生成除了流畅映射之外的所有内容。 PS:我正在使用默认方法(我的列表中的#1)。无论如何,谢谢@amuz,欢迎来到 SO。
【解决方案2】:

我遇到了类似的情况,我将实体用于 DTO 的生成器。 虽然它的目的是生成 DTO,但是,我相信它可以帮助你的情况。

https://entitiestodtos.codeplex.com/

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2016-05-23
    • 1970-01-01
    • 2013-02-10
    • 2017-12-31
    • 2013-11-26
    相关资源
    最近更新 更多