为什么Castle ActiveRecord FindAllByProperty方法不使用Cache

时间:2014-03-03 10:42:13

标签: c# caching nhibernate activerecord castle-activerecord

我有以下课程;

[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专家可以帮助我?

1 个答案:

答案 0 :(得分:1)

我不是Castle ActiveRecord的专家,但我猜这没关系..

NHibernate使用第一级缓存/身份映射。当您在会话中多次获取同一对象时,您可以保证获得相同的实例。在你的情况下,这意味着这个断言应该通过......

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

但是,每次进行调用时都会调用db查询本身。对于除session.Get和session.Find之外的任何查询都是如此(这些在Castle ActiveRecord中调用的内容我不知道)。

如果您想自己启动查询,则需要启用二级缓存。 internet上有大量有关此内容的信息。