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
Post a Comment