nhibernate - Cascade ="all" not saving child entities -
i think object model below saying party , partyname have many 1 relatioship. think cascade=all party.hbm sshould having nhib save child partyname(s).
but isn't...
can explain why partyname isn't being saved party , fix?
cheers,
berryl
mapping
<class name="party" table="parties"> <id name="id"> <column name="partyid" /> <generator class="hilo" /> </id> <discriminator column="type" not-null="true" type="string" /> <set access="field.camelcase-underscore" cascade="all" inverse="true" name="names"> <key foreign-key="party_partyname_fk"> <column name="partynameid" /> </key> <one-to-many class="parties.domain.names.partyname, parties.domain" /> </set> <subclass name="smack.core.testingsupport.nhibernate.testabledomain.somedopeydomainmodel.student, smack.core.testingsupport" discriminator-value="student" > <property name="number" /> <many-to-one class="smack.core.testingsupport.nhibernate.testabledomain.somedopeydomainmodel.course, smack.core.testingsupport" foreign-key="course_fk" name="course"> <column name="courseid" index="courseindex" /> </many-to-one> </subclass>
<many-to-one access="field.camelcase-underscore" class="parties.domain.party" foreign-key="party_fk" name="party"> <column name="partyid" index="partyindex" not-null="true"/> </many-to-one> <property name="therequiredname" not-null="true" length="50"/> <property name="everythingelse" /> <property name="contextused" length="50"/> <property name="salutation" length="20"/> <property name="effectiveperiod" type="smack.core.data.nhibernate.usertypes.daterangeusertype, smack.core.data"> <column name="effectivestart"/> <column name="effectiveend"/> </property>
failing test (and output)
[test] public void cansaveandload_allproperties() { var partyname = nameseeds.devname; partyname.party = _party; assert.that(_party.names.first(), is.equalto(partyname)); using (var tx = _session.begintransaction()) { _session.save(_party); tx.commit(); } _session.clear(); party foundparty; using (var tx = _session.begintransaction()) { foundparty = _session.get<party>(_party.id); *** <=== name s/b saved!! tx.commit(); } partyname foundname = foundparty.names.first(); //found.look(); assert.that(foundname, is.equalto(partyname)); assert.that(foundname.party, is.not.null); assert.that(foundname.therequiredname, is.equalto(partyname.therequiredname)); assert.that(foundname.everythingelse, is.equalto(partyname.everythingelse)); assert.that(foundname.contextused, is.equalto(partyname.contextused)); assert.that(foundname.salutation, is.equalto(partyname.salutation)); assert.that(foundname.effectiveperiod, is.equalto(partyname.effectiveperiod)); } nhibernate: insert parties (type, partyid) values ('parties.domain.party', @p0);@p0 = 32768 [type: int32 (0)] nhibernate: select party0_.partyid partyid2_0_, party0_.number number2_0_, party0_.courseid courseid2_0_, party0_.type type2_0_ parties party0_ party0_.partyid=@p0;@p0 = 32768 [type: int32 (0)]
with mapping of names <set>
inverse=true
, have explicitly call session.save(partynameobject) on each member of collection. if looking have nhibernate automatically save members of set when partyobject saved, need change names <set>
inverse attribute inverse=false
. tells nhibernate want party control relationship between party , partyname. must remember add each partynameobject party.names collection. otherwise, won't saved when call session.save(partyobject)
. keep in mind having parent control relationship may handy, if happen save partyobject without having loaded partynames collection, nhibernate update party fk null. in scenario cascade options set on names <set>
, might find nhibernate deleting them well.
Comments
Post a Comment