现在,程序只使用公共库来填充对象模型并序列化/反序列化到磁盘.具体来说,我们正在使用XML序列化.
这个模型有几个问题. 1)XML可能被认为是浪费.这些文件可能变得庞大而且难以处理.老实说,文件大小现在不是一个大问题. 2)我最关心的是记忆足印.将整个文件加载到对象模型中,对其进行操作,然后保存.
希望我已经表达了我的担忧,在某些时候我们将在运行时遇到此应用程序的内存问题.足够的数据将被收集到一个“数据库”(xml文件)中,无法一次性加载到内存中.
我想要的是访问由文件存储而不是内存支持的对象模型.我希望对象模型的更改最小化.访问对象时,它来自磁盘,当它被设置时,它会被保存(如果可能的话,自动保存).
我们已经使用sqlite,sql Compact 4.0和EF 4以及LINQ to XML(简要地)研究了NHibernate.我过去也使用db4o将对象缓存到磁盘,但这是一个不相关的项目.
在我潜入并花时间学习其中之一之前,我想知道我的想法是否有意义.我是否可以拥有一个“神奇地”缓存到存储介质的对象模型,而不仅仅是无限地膨胀我的内存占用?什么是完成这项工作的最短途径,即使它不是最优雅的?
还有其他技术可以帮助我吗?内存映射文件,linq-to-sql,Lazy(T)(仅用于在需要时从文件中提取对象).
我意识到这是一个开放式的问题.我正在寻找一个大图片响应和详细信息,如果有人有真实的世界经验这样做.链接会有所帮助……
谢谢.
解决方法
这个想法确实有意义.您确实可以在内存中加载您实际需要的部分(而不是整个数据库)以及比这更多的好处.
基于您要求的其他内容(对象模型的最小更改,易于从实际应用程序迁移到基于ORM的应用程序)我不确定您是否会如此轻松地获取它们.
对于像NHibernate和EF4这样的ORM,模型类非常轻量级:它们基本上只是属性容器.基于XML文件的应用程序倾向于在模型中直接拥有更多逻辑:您可能必须转移到数据访问层的逻辑.重新设计模型和数据访问层可能是您将面临的最耗时的任务.我知道这是给我的.
我从你的问题推断出的另一件事(你说你不能让所有三个程序与同一个DB交谈,你提到sqlite和sql Compact)是你通过物理复制文件在三个应用程序之间复制数据.您如何检测更改以及您需要3个数据库的对齐方式?您目前如何合并更改(如果您拥有3个应用程序中的2个可以写入数据)?
根据您复制数据的方式,ORM可能会或可能不会帮助您.
根据您的评论编辑更多积分
>如果您希望在某个时刻将文件合并到一个数据库中并且您还不确定它将是Microsoft产品,那么NHibernate是最佳选择.但是,如果您现在广泛使用LINQ(根据您的另一条评论)并希望更加无缝的转换,我会选择EF4:Nhibernate.Linq并不是真正完整的,而且有些构造不起作用.> NHibernate和EF4都有很好的文档,并且提供了关于如何从头构建完整应用程序的非常好的教程,因此学习部分非常简单.>两者都有一个“模型优先”的方法,您可以根据模型类获得一个为您创建数据库的工具,因此如果您的模型类非常轻量级,您应该能够轻松地使用它们.>在NHibernate中花费我一些时间(有时候我仍然很难工作)的事情是配置级联以按照我预期的方式运行:例如删除对象时“相关”对象会发生什么?