NHibernate二级缓存缓存实体没有缓存配置 [英] NHibernate second level cache caching entities with no caching configuration

查看:126
本文介绍了NHibernate二级缓存缓存实体没有缓存配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在会话工厂配置了二级缓存。但是对于POCO实体,我还没有启用缓存。

我使用Fluent NHibernate来配置SessionFactory和POCO实体。

以下是会话工厂的配置:

  var cfg =流利的.Configure()
数据库(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)
.Provider(NHibernate.Connection.DriverConnectionProvider,NHibernate)
.Dialect< CustomMsSql2008Dialect>()
.Driver< SqlAzureClientDriver>
.ShowSql())
.Cache(x =>
{
x.UseQueryCache();
x.UseSecondLevelCache()。ProviderClass< HashtableCacheProvider> ).UseMinimalPuts();
})

POCO实体配置如下: / p>

  public CustomerConfiguration()
{
表(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);

版本(x => x.RowVersion).UnsavedValue(0);





$ b

因此,对于Sys_Customer实体,我清楚地没有配置任何缓存,但是当我运行以下代码:数据库只被命中一次:

$ p $ 使用(ISession s = RepositorySession)
{
var f = s.Get< Customer>(new Guid(75EDC0C2-4E58-43FF-B0D8-8C52FBB2D502));
var d = f.Code;


使用(ISession s = RepositorySession)
{
var f = s.Get< Customer>(new Guid(75EDC0C2-4E58-43FF-B0D8 -8C52FBB2D502\" ));
var d = f.Code;

$ / code>

当我从SessionFactory中删除缓存配置时,数据库被击中两次。所以显然这个实体被缓存在二级缓存中。

有人可以告诉我如何避免将实体缓存到NHibernate的二级缓存?????? b $ b

解决方案

我有ClassConvention配置了二级缓存。它看起来如下:

pre $ public class ClassConvention:IClassConvention
{
///< summary>
///应用指定的实例。
///< / summary>
///< param name =instance>实例< / param>
public void Apply(IClassInstance instance)
{
instance.Table(instance.EntityType.Name);
instance.LazyLoad();
instance.Cache.NonStrictReadWrite();






$ p

这导致实体被缓存到第二个级高速缓存。我从IClassConvention中删除了配置,现在它正在按预期工作

I have configured second level cache on the session factory. However for the POCO entity I have not enabled caching.

I am using Fluent NHibernate for configuring the SessionFactory and the POCO entities.

Here is the configuration of the session factory:

            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();
                })

The POCO entity configuration is as follows:

        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");
    }

So clearly for the Sys_Customer entity i have not configured any Caching, yet when i run the following code: the database is hit only once:

        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;
        }

when I remove the Cache Configuration from the SessionFactory then the database is hit twice. so clearly the entity is getting cached in the second level cache.

Can someone tell me how to avoid caching the entity into the second level cache of NHibernate????

解决方案

I had ClassConvention that was configured with second level cache. it looked as follows:

    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();
    }
}

this was causing the entity to be cached into the second level cache. i removed the configuration from IClassConvention and now it is working as expected

这篇关于NHibernate二级缓存缓存实体没有缓存配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆