Я изо всех сил пытаюсь найти лучший способ смоделировать отношения 1: 0,1 («может иметь один» или «имеет максимум один»). Я считаю, что это называется Z кардинальности.
Например, предположим, у меня есть два класса Widget
и WidgetTest
. Не все виджеты проверены, и этот тест разрушительный, поэтому на каждый виджет может быть не более одного виджета. Также предположим, что неуместно добавлять поля WidgetTest в Widget.
Мне бы хотелось, чтобы мой публичный интерфейс был:
Widget
WidgetTest { get; set; }
WidgetTest
Widget { get; }
Модель 1: Widget имеет свойство WidgetTest, а в базе данных таблица Widget имеет уникально ограниченный внешний ключ WidgetTest. Мой администратор БД утверждает, что это позволило бы существовать записи WidgetTest без Widget.
WidgetTable
WidgetTestId (FK, UQ)
Модель 2: Widget имеет частную коллекцию WidgetTest и применяет отношение 0,1, добавляя или удаляя отдельный объект из коллекции, контролируемой общедоступным свойством WidgetTest. База данных моделирует это как 1: m с WidgetTest, имеющим уникальный ограниченный внешний ключ для Widget. Я утверждаю, что это означает принятие модели в соответствии со схемой базы данных (то есть больше работы для меня).
WidgetTestTable
WidgetId (FK, UQ)
Какая модель лучше? Чего легче достичь с помощью NHibernate? Или есть третий путь?
Редактировать ... Вот что я закончил:
public class Widget
{
// This is mapped in NH using a access strategy
private IList<WidgetTest> _widgetTests = new List<WidgetTest>(1);
public WidgetTest
{
get { return _widgetTests.FirstOrDefault(); }
set
{
_widgetTests.Clear();
if (value != null)
{
_widgetTests.Add(value);
}
}
}
}