NHibernate - как добиться этого отношения n: m? - PullRequest
0 голосов
/ 11 марта 2011

У меня есть два объекта: цвет и палитра. Каждая палитра может получить диапазон назначенных цветов. Это то, что я могу без проблем настроить с помощью Fluent NHibernate.

Но: назначение цветов - это только ограничение. Если цвет не назначен, палитра должна иметь каждый цвет, доступный в базе данных.

Мой подход заключается в том, чтобы проверить, имеет ли Palette.Colors.Count () значение 0, и если да, извлечь все цвета с помощью ColorRepository.GetAllColors () и назначить их вручную палитре.

Есть ли другой "встроенный" способ?

1 Ответ

2 голосов
/ 12 марта 2011

NHibernate будет трудно (читай: невозможно) отобразить то, что база данных не отражает.

Вы получите сильную головную боль, если назначите все доступные цвета палитре, если цвет не назначен. Перед сохранением вам нужно будет очистить список, чтобы не получить все эти цвета в таблице PaletteColorAssociation.

Как я вас понимаю, я вижу здесь два варианта:

1) Переверните все это. Я имею в виду, не сохранять цвета, которые назначены, но те, которые не назначены. Сделайте это таблицей PaletteColorExclusion. Конечно, у этого есть недостатки: 1) Если вы добавите новый цвет в таблицу «Цвета», этот цвет будет неявно частью каждой палитры и 2) Если ваше общее правило состоит в том, чтобы назначать только часть доступных цветов палитра, в результате вы получите больше строк в таблице, которые вам понадобятся.

Я не рекомендую такой подход. Он предназначен только для того, чтобы показать, как отразить эту логику в БД.

2) Модификация вашего приложения кажется лучшей идеей: не помещайте эту логику в класс Palette, а в ваши классы бизнес-логики. Пример:

public ReadOnlyCollection<Color> GetColorsForPalette(Palette p)
{
  if (p.Colors.Count() != 0)
  {
    return new ReadOnlyCollection<Color>(p.Colors);
  }
  else 
  {
    return new ReadOnlyCollection<Color>(ColorRepository.GetAllColors());
  }
}

Я не тестировал этот код и поместил туда ReadOnlyCollection, чтобы избежать соблазна изменить коллекцию, поскольку это могут быть не цвета палитры.

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