.net 从'迁移;本地';OODBMS到ORM(实体框架/SQL Server)

.net 从'迁移;本地';OODBMS到ORM(实体框架/SQL Server),.net,orm,migration,rdbms,object-oriented-database,.net,Orm,Migration,Rdbms,Object Oriented Database,不久前,我们开始开发一个新项目,该项目内部有大约25-30个不同的类/类型/模型,它们通过1:n、n:m或n:1关系彼此密切相关 当时我们使用的是本机.net oodbms系统,基本上是因为它允许我们采用对象模型,只需在这里或那里添加一些与持久性相关的方法(-calls),我们就可以开始了。然而,随着时间的推移,我们遇到了越来越多的警告,非常糟糕、不可修复(在合理的时间范围内)的限制,迫使我们实施缓慢的解决方案,导致性能和可扩展性问题变得平庸,许可费几乎增加了5倍,而我们的终端没有任何变化(他们

不久前,我们开始开发一个新项目,该项目内部有大约25-30个不同的类/类型/模型,它们通过1:n、n:m或n:1关系彼此密切相关

当时我们使用的是本机.net oodbms系统,基本上是因为它允许我们采用对象模型,只需在这里或那里添加一些与持久性相关的方法(-calls),我们就可以开始了。然而,随着时间的推移,我们遇到了越来越多的警告,非常糟糕、不可修复(在合理的时间范围内)的限制,迫使我们实施缓慢的解决方案,导致性能和可扩展性问题变得平庸,许可费几乎增加了5倍,而我们的终端没有任何变化(他们被大公司收购了)

因此,我们目前开始在可扩展性/性能以及维护方面寻找长期解决方案oodbms总是会遇到一些主要的问题,因此我们开始进一步研究,基本上现在考虑的是ORMs,希望它能让我们将大部分注意力集中在对象上,而不是与SQL争吵

因此,基本上我的问题是:有没有人对Microsoft的实体框架或任何其他.NET ORM有过任何实际经验,这些ORM可以使配置尽可能保持可维护性,并在密切/高度相关的实体中运行良好?我们存储的数据量在任何方面都不是惊人或广泛的(我们预计在未来3年内,所有实体的实例总数将达到10万个)


有人对ORM和/或从oodbms迁移到rdbms的经验有什么想法/建议吗?

我没有oodbms方面的经验,但我在NHibernate+MS SQL Server方面的经验非常积极,可以强制实施和级联一对多、多对一和多对多关系的更改


您使用的是什么OODBMS工具?可能存在OODBMS->RDBMS迁移工具,但我不知道有任何工具。

由于您有一个现有的对象模型,并且希望迁移到ORM解决方案,那么我认为NHibernate肯定是一个不错的选择。原因如下:

  • 您不必对域模型类进行(m)任何添加/更改来支持持久性。NHibernate在支持域模型中的持久性忽略方面做了很多工作,尽管您可能会发现您需要进行一些小的更改,例如将更多的方法/属性标记为虚拟
  • 映射现有对象模型后,您可以为数据库生成架构。这为域驱动(或仅对象模型优先)开发节省了大量时间。FluentConfiguration.ExposeConfiguration()支持此功能方法使用fluent NHibernate或通过hbm2ddl工具使用标准NHibernate映射文件。当然,这也有助于可维护性—对象模型的更改可以快速反映在数据库架构中
  • 使用fluent NHibernate进行映射有助于在您获得自动完成和简化的映射模型时使初始映射相当快。这也将有助于为您提供所需的可维护性-您的映射在使用fluent NHibernate的代码中声明,因此重构工具将相应地更改您的映射。您还可能会发现您可以使用Fluent NHibernate自动映射,并在大多数情况下避免手动映射对象模型
  • 使用实体框架将更具挑战性。虽然实体框架在许多方面都是一个有能力的ORM,但它没有NHibernate那么成熟,在这种情况下,有几个原因特别说明我认为它可能不是最佳选择:

  • 您必须对现有对象模型进行大量更改以支持实体框架。如果您想使用当前提供的实体框架工具,您可能需要将代码迁移到生成的分部类,这些分部类继承自EntityObject实体框架基类。此继承要求可能是,也可能是依赖于现有的对象模型对您来说不是问题。您可以通过在代码中提供支持来避免这一点,但这并非小事,我认为您将失去许多用于管理映射的内置工具支持
  • 您几乎肯定需要手动创建数据库模式。对于大小合适的对象模型,这通常不是一项无关紧要的任务
  • 实体框架不支持开箱即用的透明延迟加载。我敢肯定,透明延迟加载是OODBMS所习惯的,大多数其他ORM(当然包括NHibernate)都支持它,但在实体框架中,您会发现需要显式地加载与.Load()相关的对象(包括父关系和子关系),然后再在代码中引用它们。有解决方法(例如),但它不是内置功能
  • 总的来说,在我看来,对于对象优先开发,或者在您试图利用现有对象模型的情况下,NHIbernate是一个更好的选择。对于以数据为中心的开发,实体框架(或linq到sql,甚至亚音速)成为更可行的选择

    您可能还想评估商业ORM产品,例如-我自己对这个特定工具几乎没有经验(当有好的免费替代品时,客户通常反对为ORM付费),但它受到高度重视