セッション ファクトリで 2 次キャッシュを構成しました。ただし、POCO エンティティについては、キャッシュを有効にしていません。
SessionFactory と POCO エンティティの構成に Fluent NHibernate を使用しています。
セッション ファクトリの構成は次のとおりです。
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 エンティティについては、キャッシュを構成していませんが、次のコードを実行すると、データベースは 1 回だけヒットします。
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 からキャッシュ構成を削除すると、データベースが 2 回ヒットします。エンティティが第 2 レベルのキャッシュにキャッシュされていることは明らかです。
NHibernate の第 2 レベルのキャッシュにエンティティをキャッシュしないようにする方法を誰か教えてもらえますか????