Hi,

I am using NHibernate v5.4.9 and FluentNHibernate v3.4.0.
In this version, I am using batch fetching to improve performance.

*Configuration:*
Fluently.Configure().Database(MsSqlConfiguration.MsSql2012
.Dialect("RamSite.Repositories.NH.MsSqlConfiguration2012, 
RamSite.Repositories")
.AdoNetBatchSize(100).ShowSql()
.ConnectionString(c => c.FromConnectionStringWithKey("connectionString")))
.Mappings(m =>
{
m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
m.HbmMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
}).ExposeConfiguration(cfg =>
{
cfg.EventListeners.PreLoadEventListeners = new IPreLoadEventListener[] { 
new PreLoadEventListener() };
cfg.EventListeners.PostLoadEventListeners = new IPostLoadEventListener[] { 
new PostLoadEventListener() };
cfg.EventListeners.PostInsertEventListeners = new 
IPostInsertEventListener[] { new PostInsertEventListener() };
cfg.EventListeners.PostUpdateEventListeners = new 
IPostUpdateEventListener[] { new PostUpdateEventListener() };
cfg.EventListeners.PostDeleteEventListeners = new 
IPostDeleteEventListener[] { new PostDeleteEventListener() };
cfg.SetProperty(NHibernate.Cfg.Environment.GenerateStatistics, "true");
*cfg.SetProperty(NHibernate.Cfg.Environment.DefaultBatchFetchSize, "100");*
cfg.SetProperty(NHibernate.Cfg.Environment.BatchFetchStyle, 
BatchFetchStyle.Dynamic.ToString());
}).BuildSessionFactory();

*Mapping:*
OrderMap:
public OrderMap() { Table("tblOrder"); Id(x => x.Id); Map(x => x.Name); 
Map(x => x.ProjectId, "SiteRevisionId"); Map(x => x.Note); Map(x => 
x.Locked); Map(x => x.WBSNumber); Map(x => x.Revision); HasMany(x => 
x.InternalOrderItems).KeyColumn("OrderId").AsSet().Inverse().LazyLoad().BatchSize(100);
 
Map(x => x.OptionalWBSNumber); References(x => 
x.SupplierContractor).Column("ContractorSupplierId").Fetch.Join().NotFound.Ignore();
 
Map(x => x.OptionalWBSNumber); } 

*OrderItemMap:*
public OrderItemMap() { Table("tblOrderItem"); Id(x => x.Id); Map(x => 
x.OrderId); Map(x => x.OrderItemModelId); Map(x => x.Quantity); 
DiscriminateSubClassesOnColumn<int>("OrderItemDescriminator", 0); } public 
class TowerOrderItemMap : SubclassMap<TowerOrderItem> { public 
TowerOrderItemMap() { DiscriminatorValue(1); Map(x => x.TowerHeight); Map(x 
=> x.BasePlate); References(x => 
x.ParentOrderItem).Column("ParentOrderItemId").Fetch.Join().NotFound.Ignore(); 
HasMany(x => 
x.InternalOrderItemGroups).KeyColumn("OrderItemId").AsSet().Inverse().Not.LazyLoad();
 
Map(x => x.BaseAssemblyStructureNET); Map(x => x.BaseAssemblyBoltsNET); 
Map(x => x.TowerStructureNET); Map(x => x.TowerBoltsNET); } } 

*HQL:*
session.CreateQuery(@" from Order o where o.OrderStatusId = :orderStatusId 
") .SetParameter("orderStatusId", orderStatusId) .List<Order>(); 

*Issue:*
In this configuration, I try to get all data in one select (using batch 
fetching), but the order data is getting one select, but the OrderItem 
executes each order one select statement. If there is any special reason 
for this one. If anyone knows, please let me know.

   1. In use of *default_batch_fetch_size* in config, how does batch 
   fetching work?
   2. * In NHibernate, is the N+1 problem solved or not?*
   3. Why are the parent and child getting separate select statements 
   running?
   4. Is this configuration correct, or do I need to override anything in 
   the mapping or configuration?
   5. 



* I need a reason for using bath fetch. Why is the select statement run 
   separately? Output: [image: image] *

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/nhusers/bb33b519-102f-430f-9d03-af5fa655acc9n%40googlegroups.com.

Reply via email to