c# - NHibernate 2nd level cache don't cache the whole entity -


i've got code:

[testfixture] public class cachingtest {     [test]     public void caches_second_request()     {         var sessionfactory = createsessionfactory();          int orderid;         {             var order = new order {created = datetime.now};             order.rows.add(new orderrow {price = 123, order = order});             order.rows.add(new orderrow { price = 456, order = order });              using (var session = sessionfactory.opensession())             {                 session.save(order);                 orderid = order.id;             }         }          console.writeline("saved");          using (var session = sessionfactory.opensession())         {             var order = session.get<order>(orderid);              console.writeline(order.rows.count);         }          console.writeline("fetched first time");          using (var session = sessionfactory.opensession())         {             var order = session.get<order>(orderid);              console.writeline(order.rows.count);         }     }      private static isessionfactory createsessionfactory()     {         var automappingconfig = new automappingconfiguration();          isessionfactory sessionfactory = fluently.configure()             .database(mssqlconfiguration.mssql2008                           .connectionstring(c => c.fromappsetting("connectionstring"))                           .showsql())             .cache(c => c                             .usequerycache()                             .usesecondlevelcache()                             .providerclass<kamakuracacheprovider>())             .mappings(m =>                       m.automappings.add(                           automap.assemblyof<cachingtest>(automappingconfig)                               .conventions.add(                                   foreignkey.endswith("id"),                                   defaultlazy.never(),                                   defaultcascade.all())                               .conventions.add<cacheableconvention>()                           ))             .exposeconfiguration(configuration =>                                  new schemaexport(configuration).create(false, true))             .buildsessionfactory();          return sessionfactory;     } }  public class cacheableconvention : iclassconventionacceptance, iclassconvention {     public void accept(iacceptancecriteria<iclassinspector> criteria)     {         criteria.expect(x => x.entitytype.isany(typeof (order), typeof (orderrow)));     }      public void apply(iclassinstance instance)     {         instance.cache.readwrite();         instance.cache.includeall();     } }  public class automappingconfiguration : defaultautomappingconfiguration {     public override bool shouldmap(type type)     {         return type == typeof (order) || type == typeof (orderrow);     }      public override access getaccessstrategyforreadonlyproperty(member member)     {         return access.readonlypropertythroughcamelcasefield(camelcaseprefix.underscore);     } }  public class order {     private readonly icollection<orderrow> _rows = new collection<orderrow>();      public virtual int id { get; set; }      public virtual datetime created { get; set; }      public virtual icollection<orderrow> rows     {         { return _rows; }     } }  public class orderrow {     public virtual int id { get; set; }      public virtual order order { get; set; }      public virtual decimal price { get; set; } } 

this generate output:

nhibernate: insert [order] (created) values (@p0); select scope_identity();@p0 = 2011-04-29 13:40:39 [type: datetime (0)] nhibernate: insert [orderrow] (price, orderid) values (@p0, @p1); select scope_identity();@p0 = 123 [type: decimal (0)], @p1 = 1 [type: int32 (0)] nhibernate: insert [orderrow] (price, orderid) values (@p0, @p1); select scope_identity();@p0 = 456 [type: decimal (0)], @p1 = 1 [type: int32 (0)] saved nhibernate: select order0_.id id0_0_, order0_.created created0_0_ [order] order0_ order0_.id=@p0;@p0 = 1 [type: int32 (0)] nhibernate: select rows0_.orderid orderid1_, rows0_.id id1_, rows0_.id id1_0_, rows0_.price price1_0_, rows0_.orderid orderid1_0_ [orderrow] rows0_ rows0_.orderid=@p0;@p0 = 1 [type: int32 (0)] 2 fetched first time nhibernate: select rows0_.orderid orderid1_, rows0_.id id1_, rows0_.id id1_0_, rows0_.price price1_0_, rows0_.orderid orderid1_0_ [orderrow] rows0_ rows0_.orderid=@p0;@p0 = 1 [type: int32 (0)] 2 

the second time fetch order using method, doesn't query order table, still query orderrow table.

can configured way cached order-table data?

collection caching handled separately entity caching. assuming getting automapped .hasmany, can define convention so:

public class cacheablecollectionconvention : ihasmanyconvention, ihasmanyconventionacceptance {     public void apply (ionetomanycollectioninstance instance) {         instance.cache.readwrite ();     }      public void accept (iacceptancecriteria<ionetomanycollectioninspector> criteria) {         //whatever     } } 

Comments