【问题标题】:Why does Castle ActiveRecord FindAllByProperty method Not using Cache为什么 Castle ActiveRecord FindAllByProperty 方法不使用缓存
【发布时间】:2014-03-18 18:09:28
【问题描述】:

我有以下课程;

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

【问题讨论】:

    标签: c# caching nhibernate activerecord castle-activerecord


    【解决方案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 上有很多关于此的信息。

    【讨论】:

    • 感谢您的回答。但我不明白的是,如果我调用 Room.Find(1),我看不到正在查询的数据库(在数据库日志文件中),但可以在我的应用程序中看到正确返回的数据。
    • 这可能是因为 Castle ActiveRecord 中的 x.Find(1) 表示 session.Get 或 session.Find。那些 nhib 方法直接使用一级缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多