我正在尝试决定访问数据库的最佳策略。我知道这是一个通用问题,没有一个好的答案,但我会提供一些关于我正在寻找的内容的指南。在过去的几年里,我们一直在使用我们自己的持久性框架,尽管有限,但也发挥了作用。然而,它需要一些重大改进,我想知道我是否应该这样做或使用现有的框架之一。我正在寻找的标准(按重要性顺序排列)是:

  1. 客户端代码应该使用干净的对象,无需数据库知识。使用我们的自定义框架时,客户端代码如下所示:

    SessionManager 会话 = new SessionManager();订单 order = session.CreateEntity();order.Date = DateTime.Now;设置其他属性 OrderDetail detail = 订单。AddOrderDetail();详细信息.产品=产品;// 其他属性

    立即提交所有更改 会期。提交();

  2. 应尽可能简单而不是“太灵活”。我们需要一种单一的方式来完成大多数事情。

  3. 应该对面向对象编程有良好的支持。应该处理一对多和多对多关系,应该处理继承,支持延迟加载。
  4. 配置最好是基于 XML 的。

根据我目前的知识,我看到以下选项:

  1. 改进我们当前的框架——问题是它需要大量的努力。
  2. ADO.NET 实体框架 - 没有很好的理解,但看起来太复杂并且评论不好。
  3. LINQ to SQL - 没有很好地处理面向对象的实践。
  4. nHibernate - 似乎是一个不错的选择,但有些用户报告了太多过时的错误。
  5. SubSonic - 从简短的介绍来看,它似乎太灵活了。我不要那个。

你会建议什么?

编辑:

谢谢克雷格的详细回答。我认为如果我提供有关我们的自定义框架的更多详细信息,将会有更多帮助。我正在寻找类似的东西。这就是我们的自定义框架的工作原理:

  1. 它基于 DataSets,因此您要做的第一件事是配置 数据集并在那里编写您需要的查询。
  2. 您创建一个 XML 配置文件,指定 DataSet 表如何映射到对象,并指定它们之间的关联(支持所有类型的关联)。3.自定义工具解析XML配置并生成必要的代码。4.生成的类继承自公共基类。

为了与我们的框架兼容,数据库必须满足以下标准:

  1. 每个表应该有一个列作为主键。
  2. 所有表都必须具有在 客户。
  3. 为了处理继承,仅支持单表继承。XML 文件也几乎总是提供单一方法来实现某些目标。

我们现在要支持的是:

  • 删除数据集的依赖关系。SQL 代码应该自动生成,但框架不应该生成模式。我想手动控制数据库模式。
  • 对继承层次结构的更强大支持。
  • 与 LINQ 的可选集成。

我希望现在我要找的东西更清楚了。

有帮助吗?

解决方案

改进我们当前的框架 - 问题是它需要大量的努力

在您的问题中,您没有给出为什么应该重写可从许多其他地方获得的功能的原因。我建议重新发明一个 ORM 并不能很好地利用你的时间,除非你对 ORM 有独特的需求,而你在问题中没有指定。

ADO.NET 实体框架

我们在现实世界中使用实体框架生产软件。复杂的?据我所知,并不比大多数其他 ORM 更重要, 也就是说,“相当复杂”。 然而,它相对较新,因此社区经验和文档比 NHibernate 之类的东西要少。因此,缺乏文档很可能会让事情看起来更加复杂。

实体框架和 NHibernate 对于弥合对象关系鸿沟的问题采取了截然不同的方法。我已经更详细地写过这一点 这篇博文. 。您应该考虑哪种方法对您最有意义。

关于实体框架有很多评论,有正面的也有负面的。其中有些是有充分根据的,有些似乎来自推动其他解决方案的人。有根据的批评包括

  • 缺乏 POCO 支持。这对某些应用程序来说不是问题,但对其他应用程序来说却是问题。POCO 支持可能会在未来的版本中添加,但目前,实体框架可以提供的最好的功能是 IPOCO。
  • 整体映射文件。这对我们来说并不是一个大问题,因为我们的元数据并不是不断变化的。

然而,在我看来,有些批评似乎只见树木不见森林。也就是说,他们谈论的是对象关系映射的基本功能之外的特性,实体框架已经向我们证明了它做得很好。

LINQ to SQL - 没有很好地处理面向对象的实践

我同意。我也不喜欢 SQL Server 焦点。

nHibernate - 似乎是一个不错的选择,但有些用户报告了太多过时的错误。

嗯,NHibernate 的好处在于它周围有一个非常活跃的社区,当您遇到那些深奥的错误时(相信我,实体框架也有其深奥的错误;它似乎与领土有关)您通常可以很容易地找到解决方案。也就是说,除了我们所做的导致我们选择实体框架的评估之外,我对 NHibernate 没有太多个人经验,所以我将让其他有更直接经验的人对此发表评论。

SubSonic - 从简短的介绍来看,它似乎太灵活了。我不要那个。

当然,SubSonic 不仅仅是一个 ORM,SubSonic 用户可以选择不同的 ORM 实现,而不是使用 SubSonic 的 ActiveRecord。作为一个Web应用程序框架,我会考虑它。然而,它的 ORM 功能并不是它存在的理由,我认为有理由怀疑 SubSonic 的 ORM 部分将比专用 ORM 框架受到更少的关注。

其他提示

LLBL基因 制作非常好的 ORM 工具,它几乎可以完成您需要的所有操作。

巴蒂斯 是我最喜欢的,因为你可以更好地控制 SQL

Developer Express 持久对象或 XPO 这是众所周知的。我用了3年了。它提供了您需要的一切,除了它是商业性的并且您将自己与另一家(单一公司)联系起来以进行发展。除此之外,Developer Express 是 .NET 平台最好的组件和框架提供商之一。

XPO 代码的示例如下:

using (UnitOfWork uow = new UnitOfWork())
{
  Order order = new Order(uow);
  order.Date = DateTime.Now();
  uow.CommitChanges();
}

我建议看一下 Castle 的 ActiveRecord 我没有这方面的生产经验,我只是玩了一下他们的示例应用程序。它看起来真的很容易使用,但我不太了解它,不知道它是否符合您的所有要求

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top