【问题标题】:Adding Hand-Built Models to an EDMX将手工模型添加到 EDMX
【发布时间】:2013-07-31 10:47:26
【问题描述】:

我正在关注MSDN article 将存储库模式和工作单元模式应用于实体框架,但我被困在定制域模型和尚不存在的数据库之间的映射。

这篇文章让我创建了两个简单的 POCO,EmployeeTimeCard。它还介绍了在其中创建通用存储库和自定义实现。 (我正在使用自定义存储库,因此我可以尝试将 EF 依赖项保留在数据访问程序集中。)但是,它们在映射中的一个重要步骤上有点模糊。文章说:

有了 POCO,我们可以在 Visual Studio 中创建实体数据模型 (EDM)(参见图 1)。我们不会使用 EDM 为我们的实体生成代码。相反,我们想使用我们精心手工制作的实体。我们将仅使用 EDM 生成我们的数据库架构并提供 EF4 将对象映射到数据库所需的元数据。

它引用的“图 1”在这里:

但这就是它关于这个主题的全部内容。关于如何从 EDMX 生成 POCO,还有一个问题。 Google 提供了很多关于如何生成 POCO、从数据库生成 EDMX 等的信息。但在本演练中,我们已经有了 POCO,我需要在 EDMX 中使用它们,这反过来又会生成数据库(我假设,基于其他代码优先演练)。

我在项目中添加了一个“ADO.NET 实体数据模型”,它基本上是一个空白画布。但我没有看到如何将我现有的 POCO 添加到该画布上。我是否必须在设计表面上手动重新创建它们(在更大的域中这将是一个非常重要的重复问题)?如果是,它们如何映射到现有的?

【问题讨论】:

  • 我不确定你是否可以直接做到这一点(至少在没有一些插件工具或其他东西的情况下不能)。用 POCO 生成数据库然后Update Model From Database 怎么样?
  • @HighCore:这可能行得通。在即将到来的项目中,我想 DB 和模型之间会有一些分歧,在 Visual Studio 中拥有一个实际的 DB 项目来管理它可能是理想的。如果我要从 DB 生成 EDMX(在这个问题上,这与手工制作 EDMX 没有区别),那么它将如何映射到现有模型?
  • 我猜不需要映射,因为代码中已经有了实体和上下文,而 EDMX 仅用作 Store-to-Entities 映射
  • @HighCore:我想这值得一试。我对代码中有一个“魔术层”感到不舒服。似乎 MSDN 演练中的一个很大的漏洞......

标签: entity-framework ef-code-first


【解决方案1】:

通常,当您使用设计器时,流程正好相反 - 您使用设计器创建模型(或从数据库创建/更新模型),然后为您创建代码。创建的代码可以是 EF1 样式代码,其实体派生自 EntityObject 和属性等,它是使用作为 VS 一部分的单个文件生成器创建的(代码生成策略设置为“默认”),或者代码可以使用 T4 模板创建(代码生成策略设置为“无”),在这种情况下,您需要将 T4 模板添加到您的项目中。 EF 按照约定将 POCO 与 edmx 文件中的实体匹配(实体的名称必须相同,属性的名称和类型必须匹配等)。在文章中,出于某种原因,他们采取了相反的方式,这很奇怪,因为它要求您手动创建与设计器的所有实体和关系(因为设计器不知道如何从代码中创建实体)并确保满足要求因为约定(你甚至可能不知道其中的一些)得到满足。但是,当您从代码开始时,更好的方法是使用 EF Code First 方法并完全跳过设计器。 Code First 可以从您的代码创建数据库。它还包含迁移功能,可以让您的数据库与您的代码一起发展。最后(因为您似乎使用 Visual Studio 2010)您可以使用 EF6,它允许使用以前仅在 .NET Framework 4.5 上可用的所有优点在 .NET Framework 4 上使用。有关更多详细信息,请参见此处:http://entityframework.codeplex.com/

*支持 EF6 并与 Visual Studio 2012 和 Visual Studio 2013 一起使用的新版本设计器中的名称将发生变化

编辑以解决评论中的问题

如果您想使用 Code First,请使用 DbContext API,它是 ObjectContext API 的简化包装器。这是一个walkthrough,应该可以帮助您入门。 如果您有现有的数据库,您仍然可以使用 Code First - 不同之处在于您将无法使用迁移。开始使用此功能的最简单方法是使用 EF Power Tools。看看this 教程,看看如何做到这一点。 更多帮助here

【讨论】:

  • 本文使用 VS2010,但我使用的是 2012,因此在我的情况下可以使用一些新工具。如果我可以完全跳过设计器(我更喜欢),那么如何让 EF 将模型保存到数据库中?如果已经有一个数据库并且我需要映射到它,而不是按照惯例,而是更多地手动映射呢?
猜你喜欢
  • 2011-01-12
  • 2011-09-09
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2013-01-29
  • 2014-01-01
相关资源
最近更新 更多