1

我正在尝试缓存一个选择语句,但没有成功。

我有这个实体

public class Merchant : Entity<Merchant>
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }
    public virtual string Email { get; set; }
    public virtual string OrdersEmail { get; set; }
    public virtual string Host { get; set; }

}

映射是这样的

public class MerchantMap : ClassMap<Merchant>
{
    public MerchantMap()
    {
        Id(m => m.Id);

        Map(m => m.Name);
        Map(m => m.OrdersEmail);
        Map(m => m.Email);
        Map(m => m.Host);

        Cache.ReadWrite();
        ReadOnly();

    }
}

. 会话工厂是使用此类生成的:

    public ISessionFactory TenantConfiguration()
    {
        var connectionString = System.Configuration
                                     .ConfigurationManager
                                     .ConnectionStrings["Tenant"]
                                     .ConnectionString;

        var config = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                                        .ConnectionString(connectionString)
            )
            .Mappings(cfg => cfg.FluentMappings
                                .AddFromAssemblyOf<Entities.Merchant>()
            )
            .Cache(c =>
                   c.UseQueryCache()
                    .UseSecondLevelCache()
                    .ProviderClass<NHibernate.Cache.HashtableCacheProvider>()
                    .RegionPrefix("Tenant")
            )
            .ExposeConfiguration(c => c.SetProperty(
                                          NHibernate.Cfg
                                                    .Environment
                                                    .SessionFactoryName, 
                                          "Tenant")
            )
            .BuildConfiguration();

        var factory = config.BuildSessionFactory();
        return factory;
    }

    public ISession CreateMerchantSession()
    {
        lock (factorySyncRoot)
        {
            return TenantConfiguration().OpenSession();
        }

    }

我要缓存的唯一查询是以下查询:

var merchants = new TenantSessionSource().CreateMerchantSession()
                                         .QueryOver<Merchant>()
                                         .Cacheable().Future().ToList();

我几乎尝试了所有方法,并且将所有相关问题都涂红了,但没有成功。从 nhibernate 探查器中,我看到每次它打开一个新会话并重复执行此查询。

有任何想法吗?谢谢

4

0 回答 0