nHibernate Отображение нескольких таблиц с предложением where или несколькими столбцами

Я пытаюсь перевести таблицу "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

Мне нужно создать отображение nHibernate, которое объединяет RoomType и Text и разрешает загружать текст очереди RoomType с предложением WHERE для LandID = CurrentLanguage.

Это небольшое отображение, но я не знаю, как я могу пойти дальше:

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

Спасибо за помощь!!

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

и использовать фоллинг 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;
Другие вопросы по тегам