使用 NHibernate 和上下文更改数据库设计分层应用程序

Posted

技术标签:

【中文标题】使用 NHibernate 和上下文更改数据库设计分层应用程序【英文标题】:Designing layered app with NHibernate and context changing database 【发布时间】:2011-04-19 23:18:39 【问题描述】:

我正在设计一个 C# 应用程序

演示文稿(网站 + 弹性应用程序) 业务逻辑层(可能是 WCF 以启用多客户端平台) 数据访问层(使用 NHibernate)

我们将把我们的解决方案集成到许多预先存在的客户数据库环境中,我们希望在 DAL 中使用 NHibernate。我的同事指出,使用 NHibernate 从客户的数据库(如用户或图像)生成类会导致BLL 在每次 DB 变化时都在我们面前炸毁! 所以问题是我们如何防止这种情况发生? 我们正在考虑使用 AutoMapper 创建业务对象并将 NHibernate 对象映射到这些 BO(嗯,这会使它们成为 DTO 吗?)并防止 dal 更改影响 BLL .. 这是要走的路吗?

谢谢!

编辑:

为了更好地理解我们想要实现的目标,您可能需要 context : 我们正在为我们的公司构建前端的 Flex 和后端的 C# 中的照片存储/共享应用程序,因此我们处理代码和数据库的各个方面。

但是:该产品也可以按层购买,最终已经有一个带有 User 表或 Image 表的数据库。我在这里考虑一个新的潜在客户,他有一个包含几亿行的 Image 表,并且由于表的 ALTERing 太长而不会为我们的业务逻辑添加列。

尽管这是可能的(例如,用户表可以因为较少的行而被修改),但我们在问自己如何处理表结构更改而不影响我们每次必须集成到层数据库中的所有解决方案,从 BLL 到 Flex 中的客户端应用程序!

【问题讨论】:

【参考方案1】:

根据我的经验,您的业务对象(AKA 域对象)应该在 OO 中建模,以表示您的真实业务实体和第 3 范式的表格(这可能会根据您在速度与文件大小之后的设计而改变)

NHibernate 应该使用它的映射文件在您的 BO 和表之间进行映射。

现在你有合法的案例:

您需要添加/删除一列,我们决定删除 addressline4,这将反映您的地址对象中的更改,没关系。 您将列移动到更好的位置,我们的 Client 对象包含注释,该注释当前存储在 Contract_Extra 表中,该表将被移动到 Client 表中。在这种情况下,将列移动到更好的位置只会影响映射文件

我怀疑是否存在笼统的推理,但我希望这些示例能让您思考这一点

我没有尝试过多个数据库的NH,也应该each database have its own service on top?

这里有一些链接

Multi table entites PoEAA

希望对你有帮助

【讨论】:

我喜欢这个答案。我看到 op 用 PL、BLL 和 DAL 说话,相比之下,这个答案涉及 DDD。我希望在这方面更深入一点。 我编辑了第一篇文章,为您提供更多背景信息。我认为多表实体 + 自定义数据访问是解决方案的一部分!【参考方案2】:

听起来您想将域模型设计为与数据库无关。我也对拥有可以映射到多个不同数据库模型的中心域模型的最佳方法感兴趣。

您提议的方式是使用代码生成器从每个数据库创建 DTO,这可能是一种选择。另一种方法是为每个预先存在的数据库创建自定义 NHibernate 映射。您可能仍然需要使用一些 DTO 来降低某些映射的难度,但它可能会给您更多的控制权。

这些只是一些想法。更有经验的 NHibernate 用户可能会更好地了解您的情况。

【讨论】:

NHibernate 映射应该可以解决问题,但是如果 DB 表包含的列比我的 DTO 类多怎么办?我无法控制一些特定的表(将我们的解决方案集成到其他客户端数据库中时),因此我只能适应,这是一个问题吗?

以上是关于使用 NHibernate 和上下文更改数据库设计分层应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate - 如何使用 CompositeId 设计域对象和映射

事务如何在 nhibernate 中工作?

更改 NHibernate 中的初始 LazyLoad 行为

流畅的 NHibernate。更改级联选项时是不是需要重新创建数据库?

Nhibernate学习教程-- 第一个NHibernate程序

如何使用 MySQL 配置流畅的 nHibernate