2009-10-07 59 views
2

我刚刚开始为一个新的C#项目建模,该项目必须是可持久的。面向对象数据模型 - 我可以忽略对象关系映射器约束吗?

看起来最自然的OO模型将会有很多嵌套的.Net泛型。对象列表,这些对象也将包含其他泛型类型的列表等,至少嵌套三层。理想情况下,我想仅以OO方式设计数据模型,并让对象关系映射工具处理持久性 - 对我而言,OO设计比关系设计更容易。

但是我对ORM的初步研究表明,他们并不需要这样工作。目前还不清楚我是否可以创建任意复杂的对象模型,并期望ORM能够“自动地”保留它。 (我昨天问过这个问题)。

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

我要保持项目的设计前进,并不愿在现在研究的ORM陷入了下来。

我的直觉是刚刚设计我的对象模型周围什么,我知道我可以在C#中做,在似乎最自然的方式。这将帮助我更好地了解应用程序真正需要的内容。如果证明是必要的,那么我希望能够根据ORM限制重新设计设计。

这是一个很好的方法,还是我让自己为一个受伤的世界?预先处理已知的ORM约束是否更好,并围绕这些约束“虚弱”对象模型?

编辑:未经请求的Stefan Steinegger列出了NHibernate强加给OO代码的大部分限制条件。其他人是否可以为其他ORM提供类似的列表 - 亚音速,特别是?

+0

我相信这是昨天的问题的链接:http://stackoverflow.com/questions/1527805/orms-that-work-with-complex-net-generic-objects-eg-nested-list-etc – 2009-10-07 15:16:59

+1

我对其他ORM不太了解,但是关于这个问题有一个持续的讨论,涉及到NHibernate在这里:http://stackoverflow.com/questions/1514278/is-it-possible-to-use-nhibernate-without-altering -a-ddd-model-that-part-of-af/1514425#1514425 – 2009-10-07 15:17:10

+0

@Jeff - 这是一个很好的链接 - 我upvoted所有的答案! – 2009-10-07 15:53:21

回答

2

要决定这将是多么容易映射您的模型在关系数据库仍然高度依赖于将要使用的ORM。

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

我们几乎可以自由设计班级模型。这些限制是更多的实施细节:

  • 你需要一个默认的构造函数(可以是私营)
  • 藏品必须是IList<T>类型,ICollection<T>IDictionary<K, V>,阵列,其他一些接口或它的非通用的同行。
  • 一切都需要虚拟化才能使延迟加载成为可能。 (可选,但强烈推荐)
  • 每一个实体(非价值型)需要一个数据库主键属性和乐观锁定数据库版本属性(可选的,但强烈推荐)

你应该小心当有价值型的类(没有自己的身份和“价值”对待)是多态的。必须成为实体(需要身份)才能实现这一点。

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

+0

@Stefan - 感谢您提供额外的距离并提供我可能首先要求提供的信息。我要编辑我的问题... – 2009-10-07 15:56:56

1

我不知道太多关于其他的ORM的,但你肯定应该走那条路与NHibernate。它旨在完全像这样使用:首先以DDD方式设计您的域,稍后关心数据库和持久性相关的东西。 在引入NH时,可能需要一些(次要的)重构,但如果你有一个设计合理的领域模型,那么它们在我的经验中并不是什么大不了的,而且它们当然不是痛苦的。

1

我认为真正的问题是,我该怎么发展我的OO应用程序,仍然能够在关系存储持久化数据(对象),无论ORM或没有ORM的。您应该确保您的方法是严格关注您的物体模型,直到达到实际音量,阻抗不匹配可能会伤害到您。如果不考虑系统的关系模型,无论是否OO,都不可能开发任何关系数据库支持的系统。

而且,在你的对象模型需要被“简单化”的唯一类是那些受到持久性。所有其他人都可以像你想的那样复杂和复杂。