Mapowanie NHibernate

0

Mam tabelkę Category (Id, Name, Description) oraz CategoryTranslations (CategoryId, LangCode, PropertyName, Value)
Może kolumny Name i Description w Category są zbędne.

Chciałbym wyciągając Category otrzymać także Description we właściwym języku (załóżmy, że mam gdzieś przechowywane, chociażby kultura wątku, w jakim języku potrzebuję danych).
Czyli robiąc session.Query<Category>().Where(...)
przykładowa encja dla języka en będzie {1, Cars, Category includes cars}, a dla języka pl {1, Samochody, Kategoria zawiera samochody }.

Czy da się to jakoś ogarnąć Mappingiem, join, IUserType ?

1

Mnie to wygląda na zwykły join z where na LangCode i odpowiednią projekcję wyniku od odpowiednio utworzonego klasy. Gdzieś tu jest jakiś haczyk?

0

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:

  1. napisać klasę bazową dla mappingu, tak aby jeśli ktoś doda atrybut/zmieni typ pola automatycznie niezbędne mappingi się dodawały
  2. 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 ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1