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
, чтобы избежать соблазна изменить коллекцию, поскольку это могут быть не цвета палитры.