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;