Apparently, it's a limitation of 
NHibernate: 
http://stackoverflow.com/questions/7253749/nhibernate-cascade-alldeleteorphan-why-is-nh-deleting-each-collection-item-indi
Indeed, IMO, this should have been fixed a long time ago, it doesn't seem 
that difficult to do. Maybe you can raise an issue in JIRA?

RP

On Wednesday, August 6, 2014 3:02:47 PM UTC+1, Stevie Shannon wrote:
>
> 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