【问题标题】:ORM to abstract a traditional database plus a WCF serviceORM 抽象传统数据库和 WCF 服务
【发布时间】:2010-02-03 15:58:08
【问题描述】:

假设使用 Microsoft 的实体框架作为 ORM 来抽象/使用数据库。接下来是一个要求,它导致应用程序需要同时使用 WCF 服务和传统数据库。

据我所知,不存在可以以与实体框架相同的方式抽象 WCF 服务的 ORM 工具。

市场上有什么东西可以帮助完成这项任务吗?目标是抽象 WCF 和传统数据库,使域程序员看起来好像他们正在使用一个数据库。他们不必关心或担心底层实体被剖析并保存在多个地方(WCF 或数据库)

--- 编辑---

请注意,WCF 服务是我们无法控制的第 3 方。但同时我们还需要与一个完全不同的数据库进行通信,它恰好是一个传统的 MS Sql 数据库。

【问题讨论】:

  • 听起来您可能真的希望程序员访问 WCF Web 服务,该服务可能会在幕后与 ORM 对话,而不是反之亦然。您是否有特定的原因需要 ORM?
  • 嗨,迈克尔。嗯,这是因为 WCF 服务是我们无法控制的第 3 方。但同时我们还需要与一个完全不同的数据库进行通信,它恰好是一个传统的 MS Sql 数据库。
  • 您可以编写一个新的 WCF Web 服务,该服务与第 3 方 Web 服务和 ORM/数据库进行交互。这可能就是我会做的。不过,这仍然不是您问题的直接答案。

标签: wcf design-patterns entity-framework orm


【解决方案1】:

看看新的 WCF 数据服务。

当 .net 4 可用时,您将能够将 EF 与普通旧 CLR 对象 (POCO) 一起使用。

http://msdn.microsoft.com/en-us/data/bb931106.aspx

【讨论】:

  • 即使在 V1 中,您也可以投影到 POCO DTO。但是数据服务+1;这是要走的路。
  • 实际上,我认为我必须收回(评论,而不是投票)。他的问题不清楚,但根据他的编辑,他似乎想使用服务而不是编写服务。
【解决方案2】:

好吧,我认为你在这里有点搞混了:

需要一个 ORM 来弥合对象与关系数据的“差距”——您需要在关系数据库中的行和列之间进行映射,并在您的对象与您的 OO 世界中的属性之间进行映射。这是 ORM 的工作,也是这些工具擅长的(或多或少)。

但是:WCF 服务只是在对象周围穿梭的一种方式——我真的看不出这里有任何“映射”的差距或差异。是的,您需要处理许多问题并且需要考虑 - 但基本上,WCF 服务会(通常)向您发送一个对象或对象集合或类似的东西。

所以说真的,如果你有一个 ORM 在你的关系数据库和你的对象模型之间进行映射,那么你就已经有了对象——WCF 只是一种将这些对象提供给外部世界的方式等等——但是之间没有真正的映射这里有两个完全不同的世界。

如果您需要将您的 EF 实体映射到一些轻量级的数据转换对象 (DTO) 以通过 WCF 服务发送,您可能需要查看AutoMapper 以轻松地在两个不同对象之间进行映射。但同样:您并没有从根本上弥合这里的任何技术差距 - 只是在两组对象之间进行映射。

【讨论】:

  • 我明白了。但是,如果您尝试使用领域驱动设计原则并希望使用 POCO 对象来表示您的实体怎么办?
  • @Roberto:正如我刚刚更新的那样 - 是的,在这种情况下,您可能需要使用 AutoMapper 之类的东西在两组对象之间进行映射 - 但这不是技术映射就像关系到对象一样——它只是从一个对象到另一个对象的复制
  • 例如,假设您有一个 Student 实体以进行论证,来自该实体的一些信息通过 WCF 服务保存在某些地方,其余的则保存在传统数据库中。您希望使用工作单元(例如在 LLBLGen Pro 或 nHibernate 中)将这些数据作为事务持久化。
  • 您是否考虑过应用存储库模式(IRepository)?在您实施的“保存”操作中,您可以启动事务,只要您的服务是事务性的,环境事务就应该流向您的服务调用和 ORM 调用(假设涉及 DTC)。
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 2023-03-07
  • 1970-01-01
  • 2017-09-20
  • 2013-12-20
  • 2023-03-16
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多