Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design OO数据模型-我可以忽略对象关系映射器约束吗?_Database Design_Oop_Orm - Fatal编程技术网

Database design OO数据模型-我可以忽略对象关系映射器约束吗?

Database design OO数据模型-我可以忽略对象关系映射器约束吗?,database-design,oop,orm,Database Design,Oop,Orm,我刚刚开始为一个新的C#项目建模数据,它必须是持久的 看起来最自然的OO模型将有很多嵌套的.Net泛型。对象列表,这些对象还将包含嵌套至少三层的其他泛型类型的列表,以此类推 理想情况下,我只想以面向对象的方式设计数据模型,并让对象-关系映射工具处理持久性-对我来说,面向对象设计比关系设计容易得多 但我对ORM的初步研究表明,它们不一定是这样工作的。我还不清楚是否可以创建任意复杂的对象模型,并期望ORM“自动”地将其持久化。(我昨天问了那个问题) 我的印象是,我可能不得不将我的OO数据模型限制在我

我刚刚开始为一个新的C#项目建模数据,它必须是持久的

看起来最自然的OO模型将有很多嵌套的.Net泛型。对象列表,这些对象还将包含嵌套至少三层的其他泛型类型的列表,以此类推

理想情况下,我只想以面向对象的方式设计数据模型,并让对象-关系映射工具处理持久性-对我来说,面向对象设计比关系设计容易得多

但我对ORM的初步研究表明,它们不一定是这样工作的。我还不清楚是否可以创建任意复杂的对象模型,并期望ORM“自动”地将其持久化。(我昨天问了那个问题)

我的印象是,我可能不得不将我的OO数据模型限制在我知道ORM可以处理的结构上,这似乎是一个很大的限制,特别是当我还没有决定使用ORM时

我想继续推进项目设计,不想现在就陷入研究ORM的泥潭

我的直觉是围绕我知道我可以在C#中做的事情来设计我的对象模型,以一种看起来最自然的方式。这将帮助我更好地了解应用程序真正需要什么。我希望,如果有必要的话,我可以根据ORM限制重新考虑设计

这是一个好方法,还是我让自己陷入了一个充满伤害的世界?是否最好先处理已知的ORM约束,然后围绕这些约束“哑”对象模型


编辑:未经请求,Stefan Steinegger列出了NHibernate对OO代码施加的大部分限制。其他人能为其他ORM提供一个类似的列表吗?尤其是亚音速的吗?

我对其他ORM不太了解,但你当然应该选择NHibernate。它的用途与此完全相同:首先以DDD方式设计您的域,稍后关注数据库和持久性相关的内容。
在引入NH时,可能需要进行一些(较小的)重构,但根据我的经验,如果你有一个正确设计的域模型,重构并不是什么大问题,而且肯定不会很痛苦。

我认为真正的问题是,我如何开发OO应用程序,并且仍然能够持久保存其数据(对象)在关系存储中,无论是否有ORM。在达到实际体积之前,严格关注对象模型的方法应该没有问题,因为阻抗失配可能会对您造成伤害。如果不考虑系统的关系模型(无论是面向对象还是非面向对象),仍然不可能开发任何关系数据库支持的系统


此外,对象模型中唯一需要“简化”的类是那些需要持久化的类。所有其他的都可以像你希望的那样复杂和复杂

决定将模型映射到关系数据库有多容易仍然高度依赖于将使用的ORM

我对NHibernate有一些经验。这是迄今为止我看到的最灵活、最非侵入性的ORM(尽管我没有看到很多)。所以我可以谈谈NHibernate,即使你不使用它,它也会给你一些你应该期待的印象

我们几乎可以自由地设计类模型。限制更多地体现在实施细节中:

  • 您需要一个默认构造函数(可以是私有的)
  • 集合的类型必须为
    IList
    ICollection
    IDictionary
    、数组、一些其他接口或其非泛型对应项
  • 一切都需要是虚拟的,以使延迟加载成为可能。(可选,但强烈推荐)
  • 每个实体(非值类型)都需要一个数据库主键属性和一个用于乐观锁定的数据库版本属性(可选,但强烈建议)
在使用多态的值类型类(没有自己的标识并“按值”处理)时,应该小心。必须成为实体(需要身份)才能实现这一点


我记不起我们在NHibernate中关于类模型的任何其他限制。

我相信这是昨天问题的链接:我对其他ORM不太了解,但关于这个问题,有一个正在进行的讨论,涉及NHibernate:@Jeff-这是一个很好的链接-我对所有答案都投了赞成票@Stefan-谢谢你走了这么远的路,提供了我可能一开始就应该要求的信息。我要编辑我的问题。。。