2011-09-14 119 views
4

我一直在讀初學者3.0 NHibernate和在閱讀有關常犯的錯誤(他們幾個我一直做的),只讀策略與NHibernate和功能NHibernate

我想知道什麼方法讓一個或多個記錄只讀一些策略。現在我得到所有的行並通過它們循環,使它們只讀session.Readonly()。

我喜歡他們用流利的

class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     SchemaAction.None(); 
     ReadOnly(); 

     // Mappings 
    } 
} 

做什麼書我不知道是,如果我需要這些記錄不是隻讀會發生什麼?對我來說,這意味着我必須使這個完全相同的映射減去那兩行代碼。

所以我想這樣做,並有ReadonlyEntityMap和EntityMap,但我寧願不必重複所有設置兩次。

任何人都有想法如何做到這一點?或更好的想法只讀?

回答

4

在您的映射上使用ReadOnly()會在修改對象的屬性時禁用任何更新回數據庫。

如果你想應用某種只讀和可寫策略,我會建議使用Fluent Convention和標記接口或類似的。

如果您想禁止只寫入一個屬性,您也可以將ReadOnly()應用於屬性。我使用該技術來避免回寫到SQL Server中的計算列。

事情是這樣的:

public interface IReadOnly{} //Mark entities with this interface 

public class ReadOnlyConvention 
    : IClassConvention, IClassConventionAcceptance<IClassInspector> 
{ 
    public void Accept(IAcceptanceCriteria<IClassInspector> criteria) 
    { 
    criteria.Expect(x => x.EntityType Is IReadOnly); 
    } 

    public void Apply(IClassInstance instance) 
    { 
    instance.ReadOnly(); 
    } 
} 

更新: 如果你想要做你的時間轉換的事情我會建議爲您創造DateTime對象的IUserType其執行轉換到用戶的時間,而無需修改基礎數據。

+0

Readonly如何設置? – chobo2

+0

它會在App_Start或其他配置中同時應用NHibernate。看到這個維基頁面的底部:http://wiki.fluentnhibernate.org/Conventions –

+0

但我怎麼告訴它,我希望它是隻讀的,當我回到這種情況下與另一種情況下,我不希望它只讀嗎? – chobo2

1

這取決於你想達到的目標。如果你正在設法優化內存消耗,你應該考慮提高你的會話管理策略或使用other performance improvement techniques.例如,您可以:

  • 清除該加載你的對象,它會釋放由第一級高速緩存分配的所有內存會話。如果需要,以後可以將這些對象重新連接(合併)爲新的會話。這樣你就不需要首先讀取對象。

  • 當你不再需要它們時,驅逐一些物體。這將使其他對象保持在一級緩存中。

  • 使用IStatelessSession根本不使用1級緩存。

此外,答案取決於您的應用程序體系結構。

+0

那麼我有什麼,現在是這樣的。我得到一個或多個行。這些行具有日期時間作爲列中的一個(存儲在utc中)。爲了讓生活變得容易,只要我得到結果,所有日期時間都會轉換爲用戶本地時間。 find方法完成後,您不必考慮這些記錄所在的時區,因爲它是用戶本地時間。然而,根據nhibernate發生更新,如果發生提交,這些時間會被保存回分貝,並且所有的日期時間都不會混淆。所以現在我循環所有這些,並讓它們只讀。 – chobo2

+0

您可以清除會話或驅逐這些對象,以便NHibernate會話不再瞭解它們,並且不會嘗試爲這些對象更新數據庫。或者,您可以將轉換後的日期存儲在未映射的字段/屬性中。這樣NHibernate甚至不會知道它,並且不會考慮要更新的對象。 – Dmitry

+0

嗯我想這是一個選項。驅逐的東西仍然是我必須循環收集中的所有對象。這就是我想要阻止的。有點吮吸你回來50個對象,你必須做的第一件事是循環每一個並驅逐或使它們只讀或任何其他 – chobo2