【发布时间】:2009-07-14 13:54:11
【问题描述】:
我的情况是我基本上搞砸了。大约 1.5 年前,当我担任这个职位时,我继承了我的代码库,而不是重新发明轮子,尽管我现在知道我应该这样做,但我将 DAL 保持在与以前的开发人员几乎相同的结构中。
本质上,有一个文件(现在有 15k 行代码)充当一组使用 DataSet 和 TableAdapter 检索数据的 DAO 之间的过渡。我的 xsd 文件已经增长到这样的大小,以至于每次打开时都会导致 R# 崩溃 Visual Studio,并且现在是 15k 行的中间类也需要很长时间才能让 R# 进行分析。更不用说它很丑,它可以工作但效果不佳,而且调试起来绝对是一场噩梦。
到目前为止,我尝试的是切换到 NHibernate。 NHibernate 是一个很棒的库,但不幸的是,它的适应性不足以与我的应用程序一起使用,根据首席开发人员 (Fabio Maulo) 的说法,它几乎是我的应用程序要求和使用身份作为数据库时对 NHibernate 的限制的组合PK策略。
所以现在我又回到了设计我自己的 DAL 上。我正在为此研究几种不同的模式,但想了解您的 DAL 设计策略。以特定方式实施 DAL 有很多方法和理由,因此如果您能解释一下您的策略以及为什么它最适合您,我将不胜感激。
提前致谢!
编辑:让我解释一下为什么 NHibernate 不起作用,因为这似乎是立即响应。我的用户创建了一个“工作”,它实际上只是我的 Job 类的临时表示。在这项工作中,他们将为其提供一个或一系列权重因子,这些权重因子在创建时也是暂时的。最后,他们提供了一份工作详细信息列表,这些详细信息具有与其相关的特定权重因子。因为,在数据库中,当我继续工作时,权重因子是独一无二的,当它发现重复的权重因子时,它会下降到权重因子。我尝试在将权重因子分配给细节之前运行检查(我不想这样做,因为我不希望对 db 进行额外调用)但在 NH 中调用 CreateCriteria 也会导致会话中的刷新,根据Fabio,它破坏了我的缓存,从而杀死了作业的整个内存表示。 NH 邮件列表中的人说我应该切换到 GUID,但这不是一个可行的选择,因为转换过程将是一场噩梦。
【问题讨论】:
-
您在使用 NHibernate 时遇到什么问题?我一直将它与身份 PK 一起使用,没有问题。
-
嗯,也许他使用了长时间运行的会话(每个业务事务的会话模型),并且在这种方法中,不鼓励使用身份,因为它会破坏您的工作单元(它需要在插入新的后直接刷新实体)。一个解决方案可能是放弃身份,并使用 HiLo 身份生成器。
-
啊,是的,这是一种可能性(以及您的解决方案)。
-
我完全按照 Frederik 说的做了,我必须使用 CpBT(每个业务事务的对话),因为我使用了延迟加载。我知道没有任何软件包可以满足所有人的需求,而 NHibernate 不能,或者它在开发周期的早期就被选择为不处理此类问题。
标签: c# .net database design-patterns