To może faktycznie od początku.
Encja w kodzie wygląda tak:
public class Category
{
public virtual int Id {get;set;}
public virtual string Name {get;set;}
public virtual string Description {get;set;}
}
Chciałbym aby cały patent na tłumaczenia jakoś nie szczególnie wpływał na encję i istniejące na niej query.
Czyli jeśli potrzebuję, aby jakieś pole w encji podlegało tłumaczeniom, to dodam mu jakiś atrybut, albo typ string zamienię na jakiś inny mój np. StringTranslated.
Problemy:
- napisać klasę bazową dla mappingu, tak aby jeśli ktoś doda atrybut/zmieni typ pola automatycznie niezbędne mappingi się dodawały
- język w jakim mam pobrać tłumaczenie znany jest dopiero w runtime, kiedy user wybiera sobie w jakim języku działa (może język zmienić w dowolnej chwili). Jak przekazać "automagicznie" ten język do "query" aby wybrane zostało właściwe tłumaczenie. Czyli bez dodatkowych akcji ze strony programisty.
z pkt 1. mniej więcej sobie poradziłem
Map(x => x.Description).Formula("(select top 1 Value from CategoryTranslations ct where ct.CategoryId = [Id] and ct.LangCode = 'pl' and ct.PropertyName = 'Description')").CustomType<StringTranslated>();
Ale mam tu zahardcodowany kod jęzka
public class StringTranslated : NHibernate.UserTypes.IUserType
trochę nie wiem jak wybrnąć z mapowanium używając Join
Join("CategoryTranslations", j => j.Optional().KeyColumn("CategoryId").Map(x => x.Description).CustomType<StringTranslated>());
Ale tu łączenie nastąpi po CategoryId, a jak przekazać do where LangCode i PropertyName ?