我有两个对象:Color和Palette。每个调色板都可以分配一系列颜色。这就是我能够使用Fluent NHibernate配置而没有任何问题。
但是:颜色的分配只是一种约束。如果没有指定颜色,则调色板应具有数据库中可用的每种颜色。
我的方法是检查Palette.Colors.Count()是否为0,如果是,则通过ColorRepository.GetAllColors()获取所有颜色,并手动将它们分配给调色板。
还有另一种“内置”方式吗?
答案 0 :(得分:2)
NHibernate很难(读取:不可能)映射数据库未反映的内容。
如果没有指定颜色,则将所有可用颜色分配给调色板,您将会非常头疼。在持久化之前,你必须清空列表,这样你就不会在PaletteColorAssociation表中找到所有这些颜色。
我理解你的方式,我在这里看到两个选择:
1)转动整个事物。我的意思是,不要保存已分配的颜色,而是保存未分配的颜色。使它成为PaletteColorExclusion表。当然这有一些缺点:1)如果你在Colors表中添加一种新颜色,那么该颜色将隐含地成为每个调色板的一部分; 2)如果你的一般规则是只分配了一小部分可用颜色在调色板中,您最终会在表格中找到您需要的更多行。
我不推荐这种做法。它只是为了展示如何在数据库中反映该逻辑的方法。
2)对apporach的修改似乎是更好的想法:不要将该逻辑放在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
放在那里以避免改变集合的诱惑,因为它可能不是调色板的颜色。