the real matter, IMO, is that nullable is the default in NH. If you want something as not-nullable, in NH, you have to specify it explicitly.
On Thu, Feb 10, 2011 at 2:26 PM, Giovanni Bassi <[email protected]> wrote: > Guys, > I just found out the answer. > Here is the family: > > public class Family : Entity > { > public Family() > { > Members = new List<Person>(); > } > public virtual IList<Person> Members { get; set; } > public virtual Person Father { get; set; } > public virtual string Name { get; set; } > public virtual Person Mother { get; set; } > } > > Here is the Person: > > public class Person : Entity > { > public virtual string Name { get; set; } > public virtual Family Family { get; set; } > } > > > > There is a catch on the mapping. If you simply set the relationships you > end up getting an exception, it kind of happens a circular reference and > NHibernate gives you this: > NHibernate.PropertyValueException: not-null property references a null or > transient Family.Father > > The catch is that you have to map the Father property as nullable. This way > NHibernate first inserts the family with a null value for father, then > inserts the father Person, then updates the Family with the Person id. > > This is the mapping I ended up with: > > public class FamilyMap : ClassMap<Family> > { > public FamilyMap() > { > Id(x => x.Id).GeneratedBy.Assigned(); > Map(x => x.Name).Not.Nullable(); > References(x => x.Father).Nullable(); > References(x => x.Mother).Nullable(); > HasMany(x => x.Members).Inverse().Cascade.AllDeleteOrphan(); > } > } > > public class FamilyMap : ClassMap<Family> > { > public FamilyMap() > { > Id(x => x.Id).GeneratedBy.Assigned(); > Map(x => x.Name).Not.Nullable(); > References(x => x.Father).Nullable(); > References(x => x.Mother).Nullable(); > HasMany(x => x.Members).Inverse().Cascade.AllDeleteOrphan(); > } > } > > > And a simple test: > > [TestMethod] > public void CanCreateFamilyWithFatherAndMother() > { > //arrange > var family = new Family { Id = 1, Name = "Bassi" }; > var father = new Person { Id = 100, Name = "John" }; > var mother = new Person { Id = 101, Name = "Mary" }; > //set father as member: > family.Members.Add(father); > family.Members.Add(mother); > father.Family = family; > mother.Family = family; > //set father as the family father > family.Father = father; > //set mother as the family mother > family.Mother = mother; > > //act > _session.Save(family); > _session.Flush(); > > //assert > _session.Clear(); > var familyPersisted = _session.Get<Family>(1); > Assert.AreEqual(2, familyPersisted.Members.Count); > Assert.IsNotNull(familyPersisted.Father); > Assert.IsNotNull(familyPersisted.Mother); > } > > > Cheers, > > Giovanni Bassi > > > -- > 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. > -- 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.
