Hi,

  I have a problem with updating one-to-one mapped entity.

  In first session I create the class with a property which I map one-
to-one. Cascading is set to "all".
  In second I load the entity and try to _replace_ the property. By
replace I mean I set it to new instance.

  What I expect is that the old instance/record will be deleted and
the new one inserted.

  However what I see is only insert statement (which by subsequent
load in new session leads to exception:
NHibernate.HibernateException : More than one row with the given
identifier was found.)

  Is there a way make the one-to-one mapping work as I expect or have
I misunderstood the whole idea of one-to-one mapping?

  Thanks for any pointers, Stefan

--------------

public class Master
{
    public virtual Guid Id { get; set; }
    public virtual SingleChild SingleChild { get; set; } // one-to-one
}

public class SingleChild
{
    public virtual Guid Id { get; set; }
    public virtual Master Master { get; set; } // many-to-one
}

--------------

<class name="Data.Master, Data" table="MASTER" >
  <id name="Id" column="ID">
    <generator class="guid.comb"/>
  </id>

  <one-to-one name="SingleChild" property-ref="Master" cascade="all" /
>
</class>

<class name="Data.SingleChild, Data" table="SINGLE_CHILD" >
  <id name="Id" column="ID">
    <generator class="guid.comb"/>
  </id>

  <many-to-one name="Master" column="FK_MASTER" cascade="all" />
</class>


--------------

[Test]
public void VerifyOneToOneUpdate()
{
    Guid gid;
    // Create
    using (var session = Global.Factory.OpenSession())
    using (var tran = session.BeginTransaction())
    {
        var master = new Master();
        master.SingleChild = new SingleChild {Master = master};
        session.Save(master);
        gid = master.Id;
        tran.Commit();
    }

    // Update ??
    using (var session = Global.Factory.OpenSession())
    using (var tran = session.BeginTransaction())
    {
        var p = session.Get<Master>(gid);
        Assert.NotNull(p);
        p.SingleChild = new SingleChild { Master = p };
        session.SaveOrUpdate(p);
        tran.Commit();
    }

    // Reload
    using (var session = Global.Factory.OpenSession())
    using (var tran = session.BeginTransaction())
    {
        var p = session.Get<Master>(gid); //
NHibernate.HibernateException : More than one row with the given
identifier was found
        Assert.NotNull(p);
    }
}





-- 
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