我有以下课程;
[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 :(得分: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上有大量有关此内容的信息。