NHibernate查询多对多

时间:2013-01-16 02:22:01

标签: nhibernate model-associations

我有一个奇怪的要求。简而言之,我有一个产品表和一个语言表。每个产品都包含一个字符串的描述,用英语表示。在我的应用程序中,我需要以用户确定的15种语言之一显示描述。每个产品都包含一个IDictionary<Language, String>,其中包含按语言编制索引的本地化描述。所有产品都有英文描述,但并非所有产品在某个时间点都被翻译成所有15种语言。

奇怪的要求是:对于给定的产品,如果翻译的产品描述不存在于用户的语言中,则回退到英语。

如上所述,这可能看起来并不那么奇怪,但我正在努力解决这个问题。在几次错误的启动之后,我在SQL中创建了一个基本上创建ProductIdLanguageId的交叉连接(笛卡尔积)并与转换表连接两次的视图,一次用于所有翻译,一次用于一个英文子查询。从这里,我使用COALESCE()提取翻译,以获得产品和语言代码的每个组合的翻译,必要时用英语。因此,此视图中的列基本上是ProductIdLanguageIdTranslation

我如何映射?最重要的是,我该如何查询?我只需要能够从这个视图中读取数据。

显然这有点复杂。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

会这样吗?

<class name="Product" table="products">
  <id name="Id">  
    <generator class="native"/>  
  </id>  
  <property name="Description" />

  <map name="LocalizedDescriptions" table="descriptions">
    <key column="product_id"/>  
    <index column="language" type="String" />  
    <element column="description" type="String" />  
  </map>
</class>

关于这种情况,用户语言中没有描述,只需检查条目是否在字典中即可。

public string GetDescription(string language)
{
    return LocalizedDescriptions.ContainsKey(language) ? LocalizedDescriptions[language] : Description;
}