【问题标题】:nHibernate Multiple table mapping with where clause or multipe column mappingnHibernate 使用 where 子句或多列映射的多表映射
【发布时间】:2012-07-01 03:06:57
【问题描述】:

我正在尝试翻译表格“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

感谢您的帮助!!

【问题讨论】:

  • 您链接到的文章包含很多选项。为什么没有帮助?

标签: asp.net nhibernate orm mapping translation


【解决方案1】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多