簡體   English   中英

NHibernate:使用預加載的引用進行多對一關系

[英]NHibernate: many-to-one relationships using pre-loaded references

我使用的是多對一關系,如下所示:

類:

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的實例中,因為它們都將引用相同的Account實例。

由於延遲讀取,因此我可以訪問AnotherClass.Account.AccountID屬性,而無需進行額外的選擇。 希望這會提供一種方法。

我仍然希望對AnotherClass對象進行添加/更新/刪除,以更新AccountID屬性。

所以問題是:基於來自AnotherClass表的AccountID,如何使用緩存列表中的詳細信息而不是數據庫填充Account屬性?

由於您緩存的帳戶屬於另一個會話,因此我認為您可以創建一個攔截器(請參見此處: http : //weblogs.asp.net/srkirkland/archive/2009/09/03/simple-auditing-using-an- nhibernate-iinterceptor-part-2.aspx ),並且在加載需要帳戶的對象時,您可以鎖定對當前會話的引用並將其分配給屬性。 侵入性較小的方法可以自己實現(或使用現有的)二級緩存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM