2013-02-11 83 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