【问题标题】:Necessity to decouple business objects from entity framework (POCOs) objects?是否需要将业务对象与实体框架 (POCO) 对象分离?
【发布时间】:2013-08-31 15:59:45
【问题描述】:

在我们的应用程序中,我们将现有 DAL 从 EF 4.0 升级到 EF 5.0。
目前已经实现了通用存储库模式,我们正在使用 POCO 对象作为业务实体。
这些对象使用 WCF 属性进行修饰,因为它们在 Web 服务接口中传递并使用部分类进行扩展,以便添加更多业务和验证方法。此外,每个 POCO 实体都继承自基类“BusinessEntity”和接口“IBusinessEntity”,以便轻松使用泛型存储库方法。

我们计划将业务实体与 POCO 对象分离,以使后者成为只有属性而没有逻辑的普通类。

但是在阅读了该主题之后,目前的技术状态似乎是采用 Code First 方法并直接保留域实体(即使当然不可能对所有情况进行概括)。
Related answer 1, related answer 2.

在我们的例子中,保留带有业务逻辑的 POCO 对象并仅应用与 EF 5.0 (DbContext) 相关的更改是否有意义?或者我们应该在存储库中引入一个映射层?通过这种方式,应用程序将在业务实体上运行,并且存储库层将从外部隐藏 POCO 对象。然而,缺点是引入了复杂性,特别是在处理通用存储库时。

提前致谢。

【问题讨论】:

  • 前段时间我也遇到过类似的问题,或许有些答案对你有用:stackoverflow.com/questions/11521192/…
  • 感谢 GrandMasterFlush 的帖子。但是,我可以问您使用哪种方法从 POCO 映射业务对象? (如果你最终决定做这个决定)。
  • 我使用了由 WCF 服务调用的控制器类,它读取 EF 模型并将数据传递到标有 WCF 属性的 POCO 中。由于它不是一个很大的网站,这似乎是有道理的。
  • 我不确定这种方法是否适合我们的场景。我们有两个大系统:前端(具有提供程序和业务层的 MVC 4 应用程序)通过 WCF 连接到后端(实现业务层、DAL 和服务层的代码库)。在前端已经有来自 BE 的 POCO 之间的映射,我们暂时不会更改它。我们将专注于 BE 对象,因此直接与 EF 合作。

标签: entity-framework mapping poco


【解决方案1】:

我想与您分享我对您的问题的经验,尽管我来这里是为了寻找另一个相关问题的解决方案。

我读过的大多数人和文章都说将 EF POCO 用作业务对象……对我来说,似乎 EF 推动了这种趋势,因为如果你想将它们解耦,它可能会使开发变得更加复杂。

您说,您的系统中已经有带有 POCO 的 EF。好吧,我希望你从相反的角度来看待它:我们有一个项目,在开始时,DAL 使用我们自己用纯 ADO.NET 编写的基本“数据库处理程序”和我们自己的业务类;但现在我们也尝试支持实体框架(所以我们加载旧的数据库处理程序或 EF ......也许稍后我们将切换到 EF)。由于我们想保持数据库不变,我们采用数据库优先的方法;目前,我们无法找到一种方法来在现有业务对象和 POCO 之间建立更轻松的连接(目前我们使用简单的“投影”进行转换)。

因此,在 BL 中,插入具有 List<BObject2>(1:n 关系)的 BObject1 的以下前置代码如下所示:

 this.UnitOfWork.ExecuteTransaction(() =>
 {
    bObject1_Repository.InsertBObject1(bObject1);

    foreach (var bObject2 in bObject1.ListBObject2)
       bObject2_Repository.InsertBObject2(bObject2);
 });

一切都对我们旧的“数据库处理程序”有好处;我们重用相同的事务并隐式地使用相同的连接......但现在对于 EF,变得非常棘手。为了插入任何 bObject2,首先你可能想要一个自动生成。 bObject1 的 UID(在第一次插入后已经知道)...这在 EF 中不可用,除非您在第一次插入后过早调用 SaveChanges。一旦涉及多个“SaveChanges”调用,您就必须考虑这些事务会发生什么。分布式事务 (DTC) 可能是一个小问题……当我们想要支持 Oracle 数据库时,我们的项目就是这种情况……实际上我们被困在这里了。

我希望我也能帮助你从另一个角度看待事物......

旁注:

很高兴听到在 EF 和 Oracle 方面有经验的人对 BL 中事务使用的意见; my question 也可以帮助我。

【讨论】:

  • 感谢克里斯蒂的帖子。两个月前,我们从 Oracle 切换到 SQL Server。在此之前,由于兼容性问题,我们不得不使用 EF 4.0。我们当前的架构与使用 Oracle 时的架构相同,但现在我们正在尝试将其升级到 EF 5.0 和 DbContext。
  • @Luca:那么您已经将 Oracle 与 EF 一起使用,并且在事务升级/跨越方面没有任何问题?您介意分享一下您构建 BL 以使用 DAL 的方式吗?
  • 我们没有分布式事务,所以这种意义上的复杂性非常低。在某些情况下,我们通过在 DAL 中引入 UnitOfWork 模式来尝试避免嵌套事务的问题。 BL 通过传递泛型接口的对象与存储库一起工作,其特定类型在运行时通过反射解析,允许拥有泛型方法并减少冗余。
  • 很有趣...当你有一个 BL 函数来插入多个具有自动生成 id 的相关实体时,你有什么代码?你介意聊 5 分钟吗?
  • 我现在意识到您使用了导航属性,这就是它对您有用的原因...
猜你喜欢
  • 2011-03-04
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2012-08-14
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多