首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要ORM吗?

我需要ORM吗?
EN

Stack Overflow用户
提问于 2011-03-03 15:41:18
回答 3查看 373关注 0票数 7

我们有一个跨三个应用程序使用的对象模型。两个程序收集数据,另一个读取数据并生成报告。系统是非常不连接的,所以我们不能有一个所有程序都能与之对话的数据库。

现在,这些程序只是使用一个公用库来填充对象模型并序列化/反序列化到磁盘。具体地说,我们使用XML序列化。

这个模型有几个问题。1) XML可能被认为是浪费的。这些文件可能会变得大而笨拙。老实说,文件大小目前并不是一个大问题。2)我最关心的是内存占用。整个文件被加载到对象模型中,对其进行操作,然后保存。

希望我已经表达了我的担忧,在运行时我们会遇到这个应用程序的内存问题。足够的数据将被收集到一个单独的“数据库”(xml文件)中,以至于它不能同时加载到内存中。

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

我们已经研究了NHibernate与SQLite,SQL Compact4.0和EF4,以及LINQ to XML (简要地)。我过去也曾使用db4o将对象缓存到磁盘,但这是一个无关的项目。

在我投入时间学习其中一个之前,我想知道我的想法是否有意义。我可以有一个对象模型,它可以“神奇地”缓存到存储介质中,而不是无限地膨胀我的内存占用吗?完成这项工作的最短路径是什么,即使它不是最优雅的?

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

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-03 16:31:17

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

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

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

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

  • 如果你想在某一时刻将文件合并到一个数据库中,并且你还不确定它是不是微软的产品,那么NHibernate是最好的选择。但是,如果你现在广泛地使用LINQ (根据你的另一条评论),并且想要一个更无缝的过渡,我会选择EF4: Nhibernate.Linq并不是真正完整的,并且一些构造不能工作。
  • NHibernate和EF4都有很好的文档记录,并且都有很好的教程告诉你如何从头开始构建一个完整的应用程序,所以学习的部分非常简单。
  • 都有一个“模型优先”的方法,你可以得到一个工具来根据你的模型类为你创建数据库。所以,如果你的模型类是非常轻量级的,你应该能够在modification.
  • the中使用它们,这花了我一些时间(有时对我来说仍然很难开始工作)在NHibernate中配置级联以我期望的方式运行:例如,当你删除一个对象时,“相关”对象会发生什么?
票数 4
EN

Stack Overflow用户

发布于 2011-03-03 15:56:04

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

票数 6
EN

Stack Overflow用户

发布于 2011-03-03 16:50:51

我的建议是使用文档数据库。RavenDB会给你带来很多好处。您可以在不将对象转换为关系模型的情况下存储这些对象,就像db4o所做的那样。

但是,对于RavenDB,您可以使用Map/Reduce查询数据。另一个好处是它是使用.NET的.NET编写的,所以您会喜欢在Linq中查询。它可以作为Windows服务运行,也可以在IIS中运行。它还可以运行embedded,这对于测试非常有用。对于您的数据收集应用程序来说,这可能是一个好主意。

RavenDB还支持复制,因此您可以将数据存储在一个实例中并将其复制到另一个实例中。也许这可以解决你所拥有的分布式设置。

但是,根据您的分布式设置的性质,我认为您最好使用服务总线。您是否需要在数据收集应用程序中使用状态?如果没有,只需在服务总线上发布一条包含数据的消息,以供系统的另一部分使用。这听起来可能很复杂,但实际上并非如此。看看nServicebus吧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5177935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档