NHibernate removes entities of a many-to-one relationship from
previous owner after cloning.
I have a business object which holds different kind of lists:

public class BusinessObject
{
        int ID{get;set;}
        IList Entites{get;set;}
        ...
}

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
import="false">
        <class name="MainNamespace.BusinessObject, Model"
table="Businessobject">
                <jcs-cache usage="read-write" />
                <id name="ID" type="Int32" unsaved-value="0">
                        <generator class="identity" />
                </id>
        ...
                <list name="Units" lazy="true">
                        <key column="BusinessObjectID" />
                        <index column="BusinessObjectIndex" />
                        <one-to-many class="MainNamespace.BusinessObject, 
Model" />
                </list>

This is an example entity:

public class Entity
{
        int ID{get;set;}
        ...
}

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-
import="false">
        <class name="MainNamespace.Entity, Model" table="Entity">
                <jcs-cache usage="read-write" />
                <id name="ID" type="Int32" unsaved-value="0">
                        <generator class="identity" />
                </id>
        ...
                <many-to-one name="BusinessObject"
class="MainNamespace.BusinessObject, Model" column="BusinessObjectID" /
>

One noteable thing is that the entity contains a backward reference to
the BusinessObject in its mapping.

I don't use cascade because of the complexity of my lists and business
workflows.
The cloning process starts by creating 'new version' of business
entites by removing them from the session and set their ID-s to zero
to mar them as 'unsaved'.

Here is an example of cloning a list in my business object:

foreach(Entity entity in businessObjects)
{
        //New entity nothing has to be done
        if(entity.ID == 0) continue;

        //Evict old entity from session
        NHibernateSession.Evict(entity);
        //Mark as unsaved
        entity.ID = 0;
}

The cloning process for the main business object goes by the same way
which means an evict and setting its ID to 0.
So after this I'll end up with an unsaved instance of my
businessobject and all of my list entites.

This is the point where I will do a 'full save' on all entites. As I
can not use cascade saving I iterate through all basic entites and
save them.
But at first I save the whole BusinessObject.

//Copy to a temporary list
IList entites = businessObject.Entites;
//Empty the list
businessObject.Entites = null;

//Save the BusinessObject
NHibernateSession.Save(businessObject);

//Saving Lists
if(entites != null)
{
        foreach(Entity entity in entites)
        {
                NHibernateSession.Save(entity);
        }

        //Set back the list
        businessObject.Entites = entites
}

After this point whenever a Flush is happening NHibernate will
generate a query which removes all entites from the previous version
of the BusinessObject.

So for instance if the original ID of a BusinessObject was 1980 and
I've set it to 0 in the clone process, the ID will be 1981 when I do
the full save which is correct, but when a Flush is happening in the
full save or I commit the transaction a sql query like this will also
will be ran by NHibernate:
exec sp_executesql N'UPDATE [Entity] SET BusinessObjectID = null,
BusinessObjectIndex = null WHERE BusinessObjectID = @p0', N'@p0
int',@p0 = 1980

Where the parameter is the ID of the prevoius BusinessObject. In this
case every of my entites will be removed from the previous business
object.

I don't understand why is this happening. This beahavior did not exist
in the earlier version of NHibernate. I thought that evict removes the
previous version of my BusinessObject from the session,
I'm not sure how NHibernate 'knows' that the owner has been changed.
How can this behavior fixed?



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to