我想要一个ORM吗?

Nat*_*ate 7 c# nhibernate orm linq-to-xml sql-server-ce

我们在三个应用程序中使用了一个对象模型.两个程序收集数据,另一个程序读取数据并生成报告.系统非常断开连接,因此我们不能让所有程序都与单个数据库通信.

现在,程序只使用公共库来填充对象模型并序列化/反序列化到磁盘.具体来说,我们正在使用XML序列化.

这个模型有几个问题.1)XML可能被认为是浪费.文件可能变得庞大而且难以处理.老实说,文件大小现在不是一个大问题.2)我最关心的是记忆足印.将整个文件加载到对象模型中,对其进行操作,然后保存.

希望我已经表达了我的担心,在某些时候,我们将在运行时遇到此应用程序的内存问题.足够的数据将被收集到一个"数据库"(xml文件)中,无法一次性加载到内存中.

我想要的是访问由文件存储而不是内存支持的对象模型.我希望对象模型的更改最小化.访问对象时,它来自磁盘,当它被设置时,它被保存(如果可能的话,自动保存).

我们已经使用SQLite,SQL Compact 4.0和EF 4以及LINQ to XML(简要地)研究了NHibernate.我过去也使用db4o将对象缓存到磁盘,但这是一个不相关的项目.

在我潜入并花时间学习其中一个之前,我想知道我的想法是否有意义.我是否可以拥有一个"神奇地"缓存到存储介质的对象模型,而不是无限地膨胀我的内存占用?即使它不是最优雅的,最简单的方法是什么?

还有其他技术可以帮助我吗?内存映射文件,linq-to-sql,Lazy(T)(仅用于在需要时从文件中获取对象).

我意识到这是一个开放式的问题.我正在寻找一个大图片响应和细节,如果有人有真实的世界经验这样做.链接会有所帮助......

谢谢.

And*_*rew 6

是的,ORM将对象模型映射到关系模型.他们非常好地隐藏了读取和写入数据到数据库,缓存数据,管理内存等所有的管道工作.他们也非常能够缓存对象图的一部分,并且可以做一些事情来提高性能例如延迟加载数据.


Pao*_*lla 4

出于同样的考虑,我刚刚完成将 XML 文件支持的(主要是“继承的”)Web 应用程序迁移到 NHibernate。我也遇到过同样的情况,以前从未使用过 NHibernate,但想在这个过程中学习。这个想法确实有道理。您确实能够仅在内存中加载您实际需要的部分(而不是整个数据库),并且还有更多好处。

根据您要求的其他内容(对对象模型进行最小的更改,易于从实际应用程序迁移到基于 ORM 的应用程序),我不确定您是否会如此轻松地获得它们。对于 NHibernate 和 EF4 等 ORM,模型类非常轻量级:它们基本上只不过是属性容器。基于 XML 文件的应用程序往往在模型中直接包含更多逻辑:您可能必须将这些逻辑移至数据访问层。重新设计模型和数据访问层可能是您将面临的最耗时的任务。我知道这是给我的。

我从你的问题中推断出的另一件事(你说你不能让所有三个程序都与同一个数据库通信,并且你提到了 SQLite 和 SQL Compact),你通过物理复制文件来在三个应用程序之间复制数据。您如何检测变化以及您需要 3 个 DB 的对齐程度如何?您目前如何合并更改(如果您拥有的 3 个应用程序中有 2 个可以写入数据)?ORM 可能会也可能不会帮助您,具体取决于您复制数据的方式。

根据您的评论编辑更多要点

  • 如果您想在某一时刻将文件合并到一个数据库中,并且您还不确定它将是 Microsoft 产品,那么 NHibernate 是最佳选择。但是,如果您现在广泛使用 LINQ(根据您的另一条评论)并且想要更无缝的过渡,我会选择 EF4:Nhibernate.Linq 并不真正完整,并且某些构造不起作用。
  • NHibernate 和 EF4 都有丰富的文档,并且提供了关于如何从头开始构建完整应用程序的非常好的教程,因此学习部分非常简单。
  • 两者都采用“模型优先”方法,您可以使用一个工具根据您的模型类为您创建数据库,因此,如果您的模型类非常轻量级,您应该能够无需进行太多修改即可使用它们。
  • 在 NHibernate 中花了我一些时间(有时仍然很难开始工作)的事情是配置级联以按照我预期的方式运行:例如,当您删除一个对象时,“相关”对象会发生什么?