NH is for persistence matters. With NH what your are describing is how persist/retrieve something and not which are the rules of your business.
2010/1/26 Chris C <[email protected]> > Ah, I see, so constrained deals with the physical structure, so what > about the logical structure though? As normally if you use > constraint="false" nhibernate can no longer generate a proxy for B to > allow lazy loading (e.g. for use with vertical partitioning) despite > the fact that A will always have a B (at least logically). The only > time an A with out a B should occur is when NHibernate is in the > middle of a flush but this should be handled with in a transaction so > to any observer the rule wouldn't have been invalidated. > > On Jan 26, 2:08 pm, Fabio Maulo <[email protected]> wrote: > > if A does not require B then A should have the property B with > > constrained="false" > > > > 2010/1/26 Chris C <[email protected]> > > > > > > > > > > > > > So I see that basic problem. However, that is just the logical model, > > > physically B requires A (due to foreign key and method of generating > > > the ID) but A does not require B (although any case where B is missing > > > would be considered as data corruption). > > > > > So, how can this be correctly mapped with NHibernate? Also, does that > > > mean for one-to-one to ever work neither table involved can have a > > > foreign key constraint as NHibernate does not guarantee nor provide a > > > way to control the order in which the entities will be persisted? > > > > > I'm not even sure what alternative there is to using one-to-one since > > > I'm joining across primary keys so a standard one-to-many on either > > > side will not work? > > > > > The table's relations are essentially (if this isn't a one-to-one I'm > > > lost as to what is): > > > > > CREATE TABLE Foo ( > > > id int NOT NULL IDENTITY(1,1) PRIMARY KEY > > > ) > > > > > CREATE TABLE Bar ( > > > id int NOT NULL PRIMARY KEY FOREIGN KEY (id) REFERENCES Foo (id) > > > ) > > > > > On Jan 26, 4:48 am, Fabio Maulo <[email protected]> wrote: > > > > Sorry my answer was not clear: > > > > If A has a constraint where B must exist and B has a constraint where > A > > > must > > > > exist what you can do ? > > > > > > After read it re-read the constraints of your mapping. > > > > > > 2010/1/25 Chris C <[email protected]> > > > > > > > Even assuming I can use a different generator such as hilo or > > > > > guid.comb the following mapping still fails due to the foreign key > and > > > > > an incorrect insert order, essentially on Bar's one-to-one I need > > > > > something like inverse="true". > > > > > > > I did manage to get something working using <join><component>...</ > > > > > component></join> but it just seems messy. > > > > > > > <class name="ValueMapping.Foo, ValueMapping" table="Foo"> > > > > > <id name="Id" type="int"> > > > > > <generator class="hilo" /> > > > > > </id> > > > > > <one-to-one cascade="all" class="ValueMapping.Bar, > > > > > ValueMapping" constrained="true" foreign-key="none" name="Bar" /> > > > > > <property name="Name" type="string"/> > > > > > </class> > > > > > > > <class name="ValueMapping.Bar, ValueMapping" table="Bar"> > > > > > <id name="Id"> > > > > > <generator class="foreign"> > > > > > <param name="property">Foo</param> > > > > > </generator> > > > > > </id> > > > > > <one-to-one name="Foo" constrained="true" foreign- > > > > > key="FK_BarToFoo"/> > > > > > <property name="Rate"/> > > > > > <property name="Value"/> > > > > > </class> > > > > > > > On 25 Jan, 15:45, Chris C <[email protected]> wrote: > > > > > > I've tidied up the mapping file and switched to using the foreign > key > > > > > > generator but the basic problem you described still remains. > > > > > > NHibernate keeps insisting upon trying to save B before A, when > > > > > > instead it needs to save A then B. > > > > > > > > The database in question is an older legacy schema which cannot > be > > > > > > changed at this current point in time unfortunately. > > > > > > > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> > > > > > > <class xmlns="urn:nhibernate-mapping-2.2" > name="ValueMapping.Foo, > > > > > > ValueMapping" table="Foo"> > > > > > > <id name="Id" type="int"> > > > > > > <generator class="identity" /> > > > > > > </id> > > > > > > <one-to-one cascade="all" class="ValueMapping.Bar, > > > > > > ValueMapping" constrained="true" foreign-key="none" name="Bar" /> > > > > > > <property name="Name" type="string"/> > > > > > > </class> > > > > > > > > <class xmlns="urn:nhibernate-mapping-2.2" > name="ValueMapping.Bar, > > > > > > ValueMapping" table="Bar"> > > > > > > <id name="Id"> > > > > > > <generator class="foreign"> > > > > > > <param name="property">Foo</param> > > > > > > </generator> > > > > > > </id> > > > > > > <one-to-one name="Foo" constrained="true" foreign- > > > > > > key="FK_BarToFoo"/> > > > > > > <property name="Rate"/> > > > > > > <property name="Value"/> > > > > > > </class> > > > > > > </hibernate-mapping> > > > > > > > > On 25 Jan, 15:18, Fabio Maulo <[email protected]> wrote: > > > > > > > > > If A has a constraint where B must exist and B has a constraint > > > where A > > > > > must > > > > > > > exist and the only way to know a POID using identity is storing > a > > > > > record how > > > > > > > you can do it ? > > > > > > > > > In some case, in NH, you can use <inverse> to define the > "owner"of > > > the > > > > > > > relationship. > > > > > > > Advise: > > > > > > > 1) don't send a generated mapping because it is not > human-readable > > > > > > > 2) don't use "native" if native=identity > > > > > > > 3) don't use composite-key if you don't need it (in your case > there > > > is > > > > > only > > > > > > > one field) > > > > > > > 4) have a look to : > > > > > > > <generator class="foreign"> > > > > > > > <param name="property">Foo</param> > > > > > > > </generator> > > > > > > > > > 2010/1/25 Chris C <[email protected]> > > > > > > > > > > If I have a pair of tables that have a one-to-one relation > > > between > > > > > > > > them, how do I control the order in which they are saved > (i.e. > > > define > > > > > > > > which is the parent)? > > > > > > > > > > Currently NHibernate keeps trying to save "Bar" before it has > > > saved > > > > > > > > "Foo" and thus either fails due to a foreign key violation > when > > > using > > > > > > > > something like "guid.comb" or null key error if using > something > > > like > > > > > > > > "native". > > > > > > > > > > The mapping I have so far is listed below, the example source > is > > > at > > > > > > > >http://gist.github.com/285899 > > > > > > > > > > <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="ValueMapping.Foo, > > > > > > > > ValueMapping, Version=1.0.0.0, Culture=neutral, > > > PublicKeyToken=null" > > > > > > > > table="`Foo`"> > > > > > > > > <id name="Id" type="System.Int32, mscorlib, > Version=2.0.0.0, > > > > > > > > Culture=neutral, PublicKeyToken=b77a5c561934e089"> > > > > > > > > <column name="Id" /> > > > > > > > > <generator class="native" /> > > > > > > > > </id> > > > > > > > > <one-to-one cascade="all" class="ValueMapping.Bar, > > > ValueMapping, > > > > > > > > Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" > > > > > > > > constrained="true" foreign-key="none" name="Bar" /> > > > > > > > > <property name="Name" type="System.String, mscorlib, > > > > > > > > Version=2.0.0.0, Culture=neutral, > > > PublicKeyToken=b77a5c561934e089"> > > > > > > > > <column name="Name" /> > > > > > > > > </property> > > > > > > > > </class> > > > > > > > > > > <class xmlns="urn:nhibernate-mapping-2.2" > > > name="ValueMapping.Bar, > > > > > > > > ValueMapping, Version=1.0.0.0, Culture=neutral, > > > PublicKeyToken=null" > > > > > > > > table="`Bar`"> > > > > > > > > <composite-id mapped="false" unsaved-value="undefined"> > > > > > > > > <key-many-to-one name="Foo" class="ValueMapping.Foo, > > > > > > > > ValueMapping, Version=1.0.0.0, Culture=neutral, > > > PublicKeyToken=null"> > > > > > > > > <column name="Foo" /> > > > > > > > > </key-many-to-one> > > > > > > > > </composite-id> > > > > > > > > <property name="Rate" type="System.Int32, mscorlib, > > > > > > > > Version=2.0.0.0, Culture=neutral, > > > PublicKeyToken=b77a5c561934e089"> > > > > > > > > <column name="Rate" /> > > > > > > > > </property> > > > > > > > > <property name="Value" type="System.Int32, mscorlib, > > > > > > > > Version=2.0.0.0, Culture=neutral, > > > PublicKeyToken=b77a5c561934e089"> > > > > > > > > <column name="Value" /> > > > > > > > > </property> > > > > > > > > </class> > > > > > > > > </hibernate-mapping> > > > > > > > > > > -- > > > > > > > > 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]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]>> > > > <nhusers%[email protected]<nhusers%[email protected]> > <nhusers%252bunsubscr...@googlegroup s.com>> > > > > > <nhusers%[email protected]<nhusers%[email protected]> > <nhusers%252bunsubscr...@googlegroup s.com> > > > <nhusers%252bunsubscr...@googlegroup s.com>> > > > > > > > > . > > > > > > > > For more options, visit this group at > > > > > > > >http://groups.google.com/group/nhusers?hl=en. > > > > > > > > > -- > > > > > > > Fabio Maulo > > > > > > > -- > > > > > 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]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]>> > > > <nhusers%[email protected]<nhusers%[email protected]> > <nhusers%252bunsubscr...@googlegroup s.com>> > > > > > . > > > > > For more options, visit this group at > > > > >http://groups.google.com/group/nhusers?hl=en. > > > > > > -- > > > > Fabio Maulo > > > > > -- > > > 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]<nhusers%[email protected]> > <nhusers%[email protected]<nhusers%[email protected]>> > > > . > > > For more options, visit this group at > > >http://groups.google.com/group/nhusers?hl=en. > > > > -- > > Fabio Maulo > > -- > 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]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- Fabio Maulo -- 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.
