NHibernate один к одному против 2 многие к одному - PullRequest
5 голосов
/ 29 мая 2011

В своем блоге Айенде предполагает, что использование взаимно-однозначного отношения, вероятно, не лучший способ реализации традиционных отношений объекта 1: 1 (например, customer.Name == name.Customer).

  1. Как мне выбрать, когда использовать отношения один-к-одному?
  2. Почему я должен выбрать 2 отношения один-ко-многим
  3. Какработа один-к-одному (сгенерированные столбцы FK)

один к одному:

One-to-one

2 многие-к-одному:

enter image description here

1 Ответ

2 голосов
/ 21 июля 2011

Единственная причина, по которой я наткнулся на использование сопоставления «один ко многим», заключается в производительности.

Сначала я работал один на один, пока проект не столкнулся с проблемой производительности. Проблема возникает из-за того, что у вас обычно не может быть отложенной загрузки для сопоставления один к одному на обратной стороне. Например. когда у вас есть объект A, который может (но не обязан) иметь связанный объект B в этом отображении. В этом случае для каждой загружаемой сущности A также загружается сущность B. Это сделано для предотвращения ошибки при проверке, существует ли связанный объект. Прокси-сервер для отложенной загрузки может ввести вас в заблуждение, полагая, что связанная сущность существует, даже если ее нет. Если вы проверите подобное существование связанной сущности, у вас возникнет проблема

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

Однако, если вы используете отображение один-ко-многим, отложенная загрузка не является проблемой, поскольку разработчик работает с коллекцией, для которой мы можем создать прокси.

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

Это не должно быть проблемой, если в вашей системе можно предположить, что у сущности A всегда есть ровно одна связанная сущность B. В этом случае вы должны установить contrained = "true" для этого сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...