Hi,
I've asked this question in stackoverflow (
http://stackoverflow.com/
questions/1420498/how-to-cascade-save-with-compositeid-in-nhibernate),
but didn't get the right answer.
In short the question is. Is it possible to cascade Save operation for
referenced entities which are referenced by composite-id?
THE DB:
A(id, Name)
B(id, Name)
AB(AId, BId) references A and B
CLASSes:
public class A
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<AB> LinkToB { get; private set; }
}
public class B
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class AB
{
public virtual A A { get; set; }
public virtual B B { get; set; }
public override bool Equals(object obj) { /* routine */ }
public override int GetHashCode() { /* routine */ }
}
THE TEST:
var a = new A { Name = "a1" };
var b = new B { Name = "b1" };
a.LinkToB.Add(new AB { A = a, B = b });
//session.SaveOrUpdate(b); < I don't like this call :)
session.SaveOrUpdate(a); // I want to persist all three objects using
one call. Is it possible?
MAPPINGS:
A hbm:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
access="property" auto-import="true" default-cascade="none" default-
lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="NHibernateTest.A,
NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
table="`A`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
<property name="Name" type="System.String, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Name" />
</property>
<bag cascade="all" inverse="true" name="LinkToB">
<key>
<column name="AId" />
</key>
<one-to-many class="NHibernateTest.AB, NHibernateTest,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
</class>
</hibernate-mapping>
B hbm:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
access="property" auto-import="true" default-cascade="none" default-
lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="NHibernateTest.B,
NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
table="`B`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
<property name="Name" type="System.String, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Name" />
</property>
</class>
</hibernate-mapping>
AB hbm:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
access="property" auto-import="true" default-cascade="none" default-
lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="NHibernateTest.AB,
NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
table="`AB`">
<composite-id mapped="false" unsaved-value="undefined">
<key-many-to-one name="A" class="NHibernateTest.A,
NHibernateTest, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null">
<column name="AId" />
</key-many-to-one>
<key-many-to-one name="B" class="NHibernateTest.B,
NHibernateTest, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null">
<column name="BId" />
</key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>
Thank you!