我已经在 session 工厂上配置了二级缓存。但是对于 POCO 实体,我没有启用缓存。
我使用 Fluent NHibernate 来配置 SessionFactory 和 POCO 实体。
这是 session 工厂的配置:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)
.Provider("NHibernate.Connection.DriverConnectionProvider, NHibernate")
.Dialect<CustomMsSql2008Dialect>()
.Driver<SqlAzureClientDriver>()
.ShowSql())
.Cache(x =>
{
x.UseQueryCache();
x.UseSecondLevelCache().ProviderClass<HashtableCacheProvider>().UseMinimalPuts();
})
POCO实体配置如下:
public CustomerConfiguration()
{
Table("Sys_Customer");
DynamicUpdate();
Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
Map(x => x.Code);
Map(x => x.Name);
Map(x => x.IsActive);
Component(x => x.Contact).ColumnPrefix("Contact_");
Component(x => x.Address).ColumnPrefix("Address_");
Map(x => x.IsDeleted);
Map(x => x.CreatedOn).Column("CreatedOn");
Map(x => x.CreatedBy).Column("CreatedBy").Length(100);
Map(x => x.LastModifiedOn).Column("LastModifiedOn");
Map(x => x.LastModifiedBy).Column("LastModifiedBy").Length(100);
Version(x => x.RowVersion).UnsavedValue("0");
}
很明显,对于 Sys_Customer 实体,我没有配置任何缓存,但是当我运行以下代码时:数据库仅被命中一次:
using (ISession s = RepositorySession)
{
var f = s.Get<Customer>(new Guid("75EDC0C2-4E58-43FF-B0D8-8C52FBB2D502"));
var d = f.Code;
}
using (ISession s = RepositorySession)
{
var f = s.Get<Customer>(new Guid("75EDC0C2-4E58-43FF-B0D8-8C52FBB2D502"));
var d = f.Code;
}
当我从 SessionFactory 中删除缓存配置时,数据库会被命中两次。很明显该实体被缓存在二级缓存中。
有人可以告诉我如何避免将实体缓存到NHibernate的二级缓存中吗???
最佳答案
我有配置了二级缓存的 ClassConvention。它看起来如下:
public class ClassConvention : IClassConvention
{
/// <summary>
/// Applies the specified instance.
/// </summary>
/// <param name="instance">The instance.</param>
public void Apply(IClassInstance instance)
{
instance.Table(instance.EntityType.Name);
instance.LazyLoad();
instance.Cache.NonStrictReadWrite();
}
}
这导致实体被缓存到二级缓存中。我从 IClassConvention 中删除了配置,现在它按预期工作
关于NHibernate二级缓存在没有缓存配置的情况下缓存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952257/