0

我们有一个遗留的 ASP.Net 项目,我们目前正在使用 MVP 模式对其进行重构。对于后端,我们使用 Fluent NHibernate 和 oracle 数据库。以前的开发人员直接在数据库中进行了奇怪的本地化实现。而且我们很难用流畅的 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

所以基本上我不想像这样的 Activity 实体:

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

Activity 的名称会自动映射到数据库中正确的 LanguageName.Name 字段。NHibernate 甚至可以做到这一点吗?

4

1 回答 1

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);
于 2013-02-11T19:17:28.483 回答