0

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

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

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

这是数据库模式 在此处输入图像描述

表 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"));
                });
        }
    }

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

在此处输入图像描述

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

像这样的东西:

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

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

感谢您的帮助!!

4

1 回答 1

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; }
    }
}

并使用以下映射

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;
于 2012-07-02T06:57:28.117 回答