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