2013-07-30 205 views
2

我已經在會話工廠配置了二級高速緩存。但是對於POCO實體,我沒有啓用緩存。NHibernate第二級高速緩存實體沒有緩存配置

我使用功能NHibernate用於配置的SessionFactory和POCO實體。

這裏是會話工廠的配置:

  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的二級緩存????

+1

配置緩存,而且只命中分貝一次,然後打兩次刪除緩存配置的時候,我希望是正常的行爲。 – mxmissile

+0

但我沒有爲實體啓用緩存,但實體正在緩存。我沒有要求NHibernate緩存Sys_Customer實體,但它獲得緩存。 –

+0

我的意思是刪除緩存配置是從NHibernate會話工廠本身刪除緩存配置。即從這裏開始:.Cache(x => x.UseQueryCache(); x.UseSecondLevelCache()。ProviderClass ()。UseMinimalPuts(); }) –

回答

2

我有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配置,現在它正在按預期