2014-03-03 62 views
0

我有以下類;爲什麼Castle ActiveRecord FindAllByProperty方法不使用緩存

[ActiveRecord(Lazy = true)] 
[DataContract] 
public class Room : ActiveRecordBase<Room> 
{ 
    [PrimaryKey] 
    [DataMember] 
    public virtual Int64 RoomId { get; protected set; } 

    [Property] 
    [DataMember] 
    public virtual Int64 HotelId { get; set; } 

    [Property] 
    [DataMember] 
    public virtual string Name { get; set; } 

    [Property] 
    [DataMember] 
    public virtual string Description { get; set; } 

    public static Room[] FindByHotelId(Int64 HotelId) 
    { 
     using (new SessionScope()) 
     {  
      return (Room[])Room.FindAllByProperty(typeof(Room), "HotelId", HotelId); 
     } 
    } 
} 

雖然我使用

新SessionScope()

當調用FindAllByProperty(),數據庫查詢總是拿到的數據,而不是從返回數據緩存。

如果我請

Room.Find(1);

響應是從緩存中給出的,沒有對數據庫進行查詢。

爲什麼會發生這種情況,有沒有可以幫助我的Castle ActiveRecord專家?

回答

0

我在城堡ActiveRecord的專家,但我想這並不重要..

NHibernate的使用1級高速緩存/身份映射。當你在一個會話中多次獲取同一個對象時,你可以保證返回相同的實例。在你的情況,這意味着這個斷言應該通過...

Assert.AreSame(
Room.FindAllByProperty(typeof(Room), "HotelId", HotelId).First(), 
Room.FindAllByProperty(typeof(Room), "HotelId", HotelId).First()) 

但是,數據庫查詢本身將被調用每次你打電話。對於除session.Get和session.Find之外的任何查詢都是如此(這些在Castle ActiveRecord中稱爲我不知道)。

如果你想開始查詢自己,你需要啓用第二級緩存。在internet上有大量關於此的信息。

+0

感謝您的回答。但我不明白的是,如果我打電話給Room.Find(1)我看不到被查詢的數據庫(在數據庫日誌文件中),但可以看到數據在我的應用程序中正確返回。 – Tommassiov

+0

這可能是因爲Castle ActiveRecord中的x.Find(1)表示session.Get或session.Find。那些nhib方法直接使用第一級緩存。 – Roger

相關問題