我不得不附上相反观点的答案。做not use one-to-one
映射。至少对于 NHibernate 来说是这样。
我不是在谈论概念领域驱动设计。关于我在 DB 设计和 NHibernate 使用方面的经验。
1) one-to-one
- 刚性数据库设计
首先是共享主键的设计(继承除外)当业务需求发生变化时,可能会导致许多问题。
典型场景,与示例非常相似23.2.作者/作品 http://nhforge.org/doc/nh/en/index.html#example-mappings-authorwork, where Author已映射one-to-one
to Person。因此,Author的id(主键)来自于Person(id)。迟早,企业会来询问我们是否可以将人员映射到作者(see 拉尔斯·开普勒 http://en.wikipedia.org/wiki/Lars_Kepler例子)
我在这里想说的是:第 24 章最佳实践 http://nhforge.org/doc/nh/en/index.html#best-practices (我引用一点)
在持久类上声明标识符属性。
NHibernate 使标识符属性成为可选的。您应该使用它们的原因有很多。我们建议标识符是“合成的”(生成的,没有商业意义)并且是非原始类型。为了获得最大的灵活性,请使用 Int64 或 String。
正如这里提到的(根据我的经验),让所有实体拥有自己的实体是非常有益的代理的主键。稍后关系的变化 - 将仅影响引用(在代理键之上),而不是表/实体本身。
2) one-to-one
与 NHibernate不能偷懒
其实就是这个原因,为什么(尽管我尝试了几次)目前不使用one-to-one
根本不。这一对一不支持延迟加载。搜索更多信息,但可以在这里找到很好的解释:
- Ayende NHibernate one-to-one http://ayende.com/blog/2381/nhibernate-one-to-one (a cite)
也就是说,一对一不能延迟加载,这也是建议使用两个多对一代替的原因之一。
- 关于延迟加载的一些解释(一对一) https://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one
正如问题下方评论中的链接之一所述(cite)
您可以将所有这些属性作为列包含到实体表中 - 但在这种情况下,对于大量条目,许多列最终会变成空。
或者:您可以将这些“可选”属性放入单独的表中,与基本实体表建立 1:1(或更确切地说:0:1)关系,
嗯,使用 NHiberante 你不会得到这么多的改进。这个建议是错误的。不支持一对一的延迟加载... https://stackoverflow.com/q/389026/1679310
SUMMARY:
这就是为什么我强烈建议:使用many-to-one
or one-to-many
在可能的情况。你将会收获更多...