2013-02-11 81 views
0

我們有一個遺留的ASP.Net項目,我們目前正在重構MVP模式。 對於後端,我們使用Fluent NHibernate和oracle數據庫。 以前的開發人員直接在數據庫中有一個奇怪的本地化實現。 我們很難用流暢的nhibernate繪製它。遺留應用程序的奇怪流暢的nhibernate映射

我們有以下表格,這些表格位於不同的數據庫中。 (oracle模式)

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的異常,說明有多個與給定的ID的語言名稱。所以看起來過濾器並不總是適用。我應該設置過濾器的全局參數還是爲我實現的每個存儲庫設置參數? – 2013-02-11 22:02:30

+0

必須在創建的每個ISession上設置過濾器,因爲它僅適用於此。另外,如果languageId在每次應用程序運行時都是靜態的,那麼可以在映射級別上設置它,這會使它更容易。 – Firo 2013-02-12 07:06:53