nHibernate batch-size doesn't work

匿名 (未验证) 提交于 2019-12-03 10:10:24

问题:

I've got a problem with batch-size in nHibernate(C# - VS 2012). I set "batch-size" in the collection and in the config, but it doesn't work.

using (var s = OpenSession())         {             using (var t = s.BeginTransaction())             {                                    Parent parent = s.CreateCriteria(typeof(Parent)).List<Parent>().First();                 Console.Write(parent.Children[0]);                 t.Commit();             }         } 

nHibernate profiler shows that it takes all children at once (for example 1000 children), but it should take only 5.

Parent.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="L6.Model" assembly="L6">   <class name="Parent">     <id name="ParentId">       <generator class="native" />     </id>     <bag name="Children" batch-size="5">       <key column="ID_Parent"/>       <one-to-many class="Child"/>     </bag>   </class> </hibernate-mapping> 

Child.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="L6.Model" assembly="L6">   <class name="Child">     <id name="ChildId">       <generator class="native" />     </id>     <many-to-one name="Parent" column="ID_Parent" class="Parent" />   </class> </hibernate-mapping> 

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?> <!--  This template was written to work with NHibernate.Test. Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it  for your own use before compile tests in VisualStudio. --> <!-- This is the System.Data.dll provider for SQL Server --> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">     <session-factory>         <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>         <property name="connection.connection_string">             Server=.;initial catalog=Lista6;Integrated Security=SSPI         </property>     <property name="adonet.batch_size">5</property>         <property name="show_sql">true</property>         <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>         <property name="command_timeout">60</property>         <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>     <property name="generate_statistics">true</property>     <mapping file="Child.hbm.xml" />     <mapping file="Parent.hbm.xml" />   </session-factory> </hibernate-configuration>   

Do you have any ideas why batch-size doesn't work?

回答1:

You misunderstood what batch-size means.

It means it will read 5 COLLECTIONS OF Children at once, not that it will load 5 elements of the collection.

adonet.batch_size, on the other hand, means that insert/update/delete statements will be sent in groups of that size in order to have less roundtrips.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!