nHibernate使用where子句或多列映射的多表映射

时间:2012-06-29 15:06:13

标签: asp.net nhibernate orm mapping translation

我正在尝试翻译“RoomType”表。

我创建了一个“文本”表,其中包含:

Id, LangID, TranslatedText
001, EN, Single
001, IT, Singola
002, EN, Double
002, IT, Doppia

这是DB Schema enter image description here

表RoomType包含: ID,TextID,MaxBed 01,001,1 02,002,2

我需要创建一个连接RoomType和Text的nHibernate映射,并允许在LandID = CurrentLanguage上加载带有WHERE子句的RoomType排队文本。

这是一个小小的映射,但我不知道接下来会怎么做:

public class RoomTypeaMap : ClassMapping<RoomType>
    {
        public RoomTypeaMap()
        {
            Join("Texts", el =>
                {
                    el.Key(k => k.Column("TextID"));
                });
        }
    }

作为替代方案,我可以为每种语言添加一列

enter image description here

在这种情况下,我需要映射获取从和(偏好)到不同列的房型的本地化名称。

这样的事情:

public class RoomTypeaMap : ClassMapping<RoomType>
    {
        public RoomTypeaMap()
        {
            Property(el => el.Name, m =>
                {
                    m.Formula("Name_" + currentLanguage);
                });
        }
    }

我找到了这篇有趣的帖子,但它对我没有帮助: http://nhforge.org/wikis/howtonh/localization-techniques.aspx

感谢您的帮助!!

1 个答案:

答案 0 :(得分:2)

我将摆脱语言表并将文本表作为地图的元素表

public class RoomType
{
    public virtual int Id { get; set; }
    public virtual IDictionary<string, string> Names { get; private set; }
    public virtual string Name
    {
        get { return Names[Thread.CurrentThread.CurrentUICulture.Name]; } // FIXME: fall back to default language if language not available
        set { Names[Thread.CurrentThread.CurrentUICulture.Name] = value; }
    }
}

并使用folling Mapping

public RoomTypeMap()
{
    [...]
    HasMany(mc => mc.Names)
        .Table("Texts")
        .KeyColumn("RoomType_id")
        .AsMap("language_id")
        .Element("value")

更新

实施回退

string name;
var currentlanguage = Thread.CurrentThread.CurrentUICulture;     // eg en-US
if (!map.TryGetValue(currentlanguage.Name, out result) &&        // en-US
    !map.TryGetValue(currentlanguage.Parent.Name, out result))   // en
{
    result = "fallback name";
}
return name;