NHibernate:使用预加载引用的多对一关系

时间:2011-02-21 14:25:19

标签: c# nhibernate

我正在使用如下多对一关系:

类:

public class Account
{
    public virtual long AccoungID { get; set; }
    public virtual string UserName { get; set; }
}

public class AnotherClass
{
    public virtual long AClassID { get; set; }
    public virtual Account Account { get; set; }
}

映射:

  <class name="Account">
    <id name="AccountID">
      <generator class="hilo"/>
    </id>
    <property name="Username"/>
  </class>  

  <class name="AnotherClass">
    <id name="AnotherClassID">
      <generator class="hilo"/>
    </id>
    <many-to-one name="Account" class="Account" column="AccountID"/>
  </class>

这样工作正常,对AnotherClass实例的Account属性进行了惰性读取。

但是,由于我正在使用的应用程序,将会有很多AnotherClass实例,具有高吞吐量。但是只会有少数账户。帐户已缓存在列表的内存中。我可以保证内存中的帐户列表与数据库中的帐户列表匹配。

我想拦截对象的填充或惰性读取,并在缓存的帐户列表中引用正确的项目,而不是懒惰的读取命中数据库的帐户详细信息。这有两个好处 - 选择少得多,并且对帐户的任何更改都会自动反映在AnotherClass的实例中,因为它们都会引用同一个帐户实例。

由于延迟读取,我可以访问AnotherClass.Account.AccountID属性而不会产生额外的选择。希望这将提供一种方式。

我仍然希望在AnotherClass对象上添加/更新/删除以更新AccountID属性。

所以问题是:我如何根据来自AnotherClass表的AccountID,用缓存列表而不是数据库中的详细信息填充Account属性?

1 个答案:

答案 0 :(得分:1)

由于您缓存的帐户属于另一个会话,我认为您可以创建拦截器(请查看此处:http://weblogs.asp.net/srkirkland/archive/2009/09/03/simple-auditing-using-an-nhibernate-iinterceptor-part-2.aspx),当加载需要帐户的对象时,您可以锁定对当前会话的引用并将其分配给属性。一种不太干扰的方式可以实现自己(或使用现有的)二级缓存。