2013-02-11 2 views
0

У нас есть проект ASP.Net, который мы в настоящее время реорганизуем с шаблоном MVP. Для бэкэнд мы используем Fluent NHibernate с базой данных оракула. Предыдущие разработчики имели странную реализацию локализации непосредственно в базе данных. И у нас есть трудное время, чтобы сопоставить его с белым nhibernate.Странное свободное отображение nhibernate для устаревшего приложения

У нас есть следующие таблицы, которые находятся в разных базах данных. (схемы оракулов)

db1.Activity 
(
    ID,    (pk) 
    ID_LANGUAGENAME, (fk) 
    INPUT_DATE, 
    and so on... 
) 

db2.LanguageName 
(
    ID,    (pk) 
    ID_LANGUAGE,  (pk) 
    NAME 
) 

db2.Language 
(
    ID, 
    LANGUAGE, 
    LANGUAGE_SHORT 
) 

ID_LANGUAGE хранится в переменной сеанса ASP.Net. Я хочу отобразить объекты, чтобы я мог сделать что-то подобное, как этот запрос.

SELECT LN.NAME, A.INPUT_DATE FROM db1.Activity A 
INNER JOIN db2.LanguageName LN ON A.ID_LANGUAGENAME = LN.ID 
INNER JOIN db2.Language L ON LN.ID_LANGUAGE = L.ID 
WHERE A.ID = :ACTIVITYID AND L.ID = :LANGUAGEID_FROM_SESSION_VARIABLE 

Поэтому в основном я wan't сущность деятельности, которая выглядит следующим образом:

public class Activity 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime InputDate { get; set; } 
} 

Если название Активность прибудет пользователь автоматически преобразуются в соответствующей LanguageName.Name поле в базе данных. Возможно ли это с помощью NHibernate?

ответ

2

Я не уверен, если это лучший способ

<filter-def name="LanguageFilter"> 
    <filter-param name="activeLanguage" type="System.UInt32"/> 
</filter-def> 

<class name="Activity"> 
    <id name="Id"/> 

    <many-to-one name="NameHolder" column="ID_LANGUAGENAME"/> 

    <property name="InputDate"/> 
</class> 

<class name="ActivityName" tble="LanguageName"> 
    <id name="Id"/> 

    <property name="Name"/> 
    <filter name="LanguageFilter" condition=":activeLanguage = ID_LANGUAGE"/> 
</class> 

public class Activity 
{ 
    public virtual int Id { get; set; } 

    protected virtual ActivityName NameHolder { get; set; } 
    public virtual string Name 
    { 
     get { return NameHolder.Name; } 
     set { NameHolder.Name = value; } 
    } 

    public virtual DateTime InputDate { get; set; } 
} 

И Запрос

// at the beginning of the request 
s.EnableFilter("LanguageFilter").SetParameter("activeLanguage", Session["Language"]); 

var activity = session.QueryOver<Activity>() 
    .Where(a => a.Id == activityId) 
    .Single(); 

Console.Writeline(activity.Name); 
+0

Этот вид работ, но когда я карту LANGUAGENAME к деятельности в качестве ссылочного соотношения (1 к 1) я иногда получаю исключение NHibernate, указывающее, что существует несколько языков с данным идентификатором. Поэтому кажется, что фильтр не всегда применяется. Должен ли я устанавливать параметры фильтра глобально или для каждого репозитория, который я реализую? –

+0

фильтр должен быть установлен на каждом ISession, созданном, потому что он применяется только к этому. Кроме того, если языкId был бы статичным для запуска приложения, его можно было бы установить на уровне сопоставления, что сделало бы его еще проще. – Firo