NHibernate一对一vs 2多对一

Dar*_*bio 5 c# nhibernate

在他的博客中,Ayende建议使用一对一可能不是实现传统1:1对象关系的最佳方式(例如customer.Name == name.Customer).

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

一对一:

一比一

2多对一:

在此输入图像描述

Nik*_*vić 2

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

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

if (entityA.EntityB == null) HandleNoEntityB();
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用一对多映射,则延迟加载没有问题,因为开发人员正在使用我们可以为其创建代理的集合。

if (entityA.EntitiesB.Count == 0) HandleNoEntityB();
Run Code Online (Sandbox Code Playgroud)

如果您可以在系统中假设实体 A 始终具有一个相关实体 B,那么这不一定是问题。在这种情况下,您应该在该映射上设置 contrained="true"。