2010-08-25 12 views
0

我在想如何最好地實現一個屬性(這裏是LatestRequest),它是隻讀的,並且由查詢支持。如何在休眠中映射由查詢支持的只讀屬性

在這裏,我有一個導出,它可以被要求多次發生。我想在Export上擁有一個屬性以獲取最新的ExportRequest。目前,我有一個公式一個多到一的映射,這樣的:

<class name="Export" table="Exports"> 
    <id name="Id"> 
    <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    <bag name="Requests" cascade="all,delete-orphan" inverse="true" access="field.camelcase" order-by="CreationDate desc"> 
    <key column="ExportId"/> 
    <one-to-many class="ExportRequest"/> 
    </bag> 
    <many-to-one name="LatestRequest" 
       class="ExportRequest" 
       formula="(select top 1 ExportRequests.Id from ExportRequests order by ExportRequests.CreationDate desc)"/> 
</class> 

<class name="ExportRequest" table="ExportRequests"> 
    <id name="Id"> 
    <generator class="native" /> 
    </id> 
    <many-to-one name="Export" 
     class="Export" 
     column="ExportId" 
     not-null="true" /> 
    <property name="CreationDate" /> 
    <property name="Tag" /> 
</class> 

然而,由於ExportRequests.IdLatestRequest被取出時,出口是牽強,該訪問模式返回陳舊數據:

var export = session.Get<Export>(exportId); 

export.AddRequest(new ExportRequest(DateTime.Now, "Foo")); 

Assert.AreEqual("Foo", export.LatestRequest.Tag); // fails due to stale data 

session.Update(export); 

那麼,實施LatestRequest屬性的最佳方式是什麼?

我可以更改LatestRequest的獲取方法,以便它執行一個Find查詢,該查詢應該是最新的,但我不確定如何使導出知道該會話。

回答

1

有幾種方法可以解決這個問題。我可能不會試圖通過這種方式使其「自動」。爲了提高性能和簡單,我只想讓一個正常的參考和業務邏輯進行管理或實體是這樣的:

class Export 
{ 
    private IList<ExportRequest> requests; 

    ExportRequest LatestRequest { get; private set; } 

    public void AddRequest (ExportRequest request) 
    { 
    requests.Add(request); 
    LatestRequest = request; 
    } 
} 

所以你不需要任何特殊的映射,也沒有任何額外的查詢來獲得最新的要求。而且,最重要的是,實體在內存中是一致的,並且不依賴於持久性。

但是,如果解決這個問題,實體和業務邏輯管理數據(在內存中)是非常重要的。它應該是「堅持無知」。數據庫和數據訪問層不負責管理實體的關係和邏輯。