我正在尝试缓存一个选择语句,但没有成功。
我有这个实体
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 探查器中,我看到每次它打开一个新会话并重复执行此查询。
有任何想法吗?谢谢