2011-05-29 57 views
5

In his blog,Ayende建议使用一对一可能不是实现传统1:1对象关系的最佳方式(例如customer.Name == name.Customer)。NHibernate一对一vs 2多对一

  1. 如何选择何时使用一对一关系?
  2. 我为什么要选择2一个一对多的关系
  3. 如何在一到一个工作(有没有FK列生成)

一对一:

One-to-one

2多到一个:

enter image description here

+0

您确定没有生成FK列吗?对我来说,它们是生成的,并且数据库看起来像是一对多的关系。也许你错误地使用了“Invserse”双方? – 2011-05-30 10:14:37

+0

是的,我确定 - 一对一表看起来像实体,没有FK键。 – Darbio 2011-05-30 11:07:00

+2

有两种方法可以进行一对一的操作。您生成它的方式,它使用这两个实体的主键来加入它们。在第二种情况下,您有一个具有唯一约束的外键http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone – Vadim 2011-05-30 20:13:17

回答

2

我遇到过使用一对多映射的唯一原因是性能。

我最初一直以一对一的方式直到项目遇到性能问题。发生问题是因为您通常无法在反面进行一对一映射的延迟加载。例如。当您拥有可以(但不必)在该映射上具有相关实体B的实体A时。在这种情况下,对于您加载的每个实体A,实体B也会加载。这样做是为了防止检查相关对象是否存在错误。代理的延迟加载会误导你认为相关的实体存在,即使它不存在。如果您检查相关的实体存在,这样你会在一个问题

if (entityA.EntityB == null) HandleNoEntityB(); 

如果你使用一个一对多的映射然而,延迟加载是没有问题的,因为开发人员都使用一个集合,我们可以创建代理。

if (entityA.EntitiesB.Count == 0) HandleNoEntityB(); 

这并不一定是一个问题,如果你可以让你的系统的假设,即实体A始终有且只有一个相关实体B.在这种情况下,你应该设置该contrained =“真”映射。