NHibernate - 如何实现这个n:m关系?

时间:2011-03-11 17:41:41

标签: nhibernate fluent-nhibernate

我有两个对象:Color和Palette。每个调色板都可以分配一系列颜色。这就是我能够使用Fluent NHibernate配置而没有任何问题。

但是:颜色的分配只是一种约束。如果没有指定颜色,则调色板应具有数据库中可用的每种颜色。

我的方法是检查Palette.Colors.Count()是否为0,如果是,则通过ColorRepository.GetAllColors()获取所有颜色,并手动将它们分配给调色板。

还有另一种“内置”方式吗?

1 个答案:

答案 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放在那里以避免改变集合的诱惑,因为它可能不是调色板的颜色。