I had actually attempted to fall-back to Clearing the collection prior to 
doing the Delete, however, in this scenario, calling Clear() on the User's 
Attribute collection will also generate an individual DELETE for each 
UserAttribute and each Attribute - again the N+1 problem.

On Wednesday, August 6, 2014 2:52:57 PM UTC+1, Ricardo Peres wrote:
>
> Not exactly what you want, but if you call Clear() on a collection, it 
> should delete all records with a single DELETE statement.
>
> RP
>
> On Tuesday, August 5, 2014 5:02:37 PM UTC+1, Stevie Shannon wrote:
>>
>> I've spent some time on this problem scouring resources online and a 
>> couple of books I have on NH; but I'm struggling to get to the bottom of it.
>>
>> Basically: I'm finding that cascading deletes is sending SQL with many 
>> individual deletes, i.e. the N+1 problem.
>>
>> I have three tables: User, UserAttribute and Attribute. Each User has 
>> many UserAttributes, each UserAttribute has one Attribute - represented by 
>> the following Maps:
>>
>>     public UserMap() {
>>       Id(x => x.Id);
>>
>>       Map(x => x.Description);
>>
>>       HasMany(x => x.Attributes)
>>         .Inverse()
>>         .Cascade.AllDeleteOrphan();
>>     }
>>
>>     public UserAttributeMap() {
>>       Id(x => x.Id);
>>
>>       References(x => x.User)
>>         .Not.Nullable();
>>
>>       References(x => x.Attribute)
>>         .Not.Nullable()
>>         .Cascade.All();
>>     }
>>
>>     public AttributeMap() {
>>       Id(x => x.Id);
>>
>>       Map(x => x.Name)
>>         .Unique();
>>     }
>>
>> The problem I'm experiencing is that when I delete a User entity, the 
>> cascade generates an individual delete for each UserAttribute and each 
>> Attribute; which is a potentially large performance problem (A User could 
>> typically have hundreds of Atributes).
>>
>> In the above test scenario my schema is then generated using FluentNH, I 
>> have an IdConvention setting all Ids to GuidComb and In addition to this, I 
>> have a repository that I go through to access the Session.SaveOrUpdate, 
>> Session.Delete, etc - each of which is wrapped in a Transaction.
>>
>> Is there something obviously wrong with the mapping that would be 
>> triggering the N+1 problem here? Is there anything I can do to stop it? Is 
>> this crazy talk?
>>
>> -------
>>
>> As a side note, my NHibernate configuration already includes a large 
>> batch size, but as far as I'm aware batching won't wrap up something like 
>> this? They certainly don't appear to be batched when I profile them.
>>
>>     NHibernate v3.3.1.4000
>>     FluentNHibernate v 1.4.0.0
>>
>>     UserTable: 
>>     Id
>>     Description
>>
>>     UserAttributeTable: 
>>     Id
>>     User_id (FK)
>>     Attribute_id (FK)
>>
>>     AttributeTable: 
>>     Id
>>     Name
>>
>>
>>

-- 
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 post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to