I have the following classes and smooth mappings:
public class A { public virtual int Id { get; private set; } public virtual string MyString { get; set; } public virtual IList<B> MyChildren { get; set; } } public class B { public virtual int Id { get; private set; } public virtual DateTime TheDate { get; set; } } public sealed class AMap : ClassMap<A> { public AMap() { Id(x => x.Id).GeneratedBy.Native().UnsavedValue(0); Map(x => x.MyString); HasMany(x => x.MyChildren).AsList(x => x.Column("Ordinal")).KeyColumn("AId").Not.KeyNullable(); } } public sealed class BMap : ClassMap<B> { public BMap() { Id(x => x.Id).GeneratedBy.Native().UnsavedValue(0); Map(x => x.TheDate); } }
This leads to the following mapping for A:
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="A" table="`A`"> <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0"> <column name="Id" /> <generator class="native" /> </id> <property name="MyString" type="AnsiString"> <column name="MyString" length="150" not-null="true" /> </property> <list name="MyChildren" mutable="true"> <key not-null="true"> <column name="AId" /> </key> <index> <column name="Ordinal" /> </index> <one-to-many class="B" /> </list> </class>
But when I really try to save an instance of A, I get a NullReferenceException :
System.NullReferenceException : Object reference not set to an instance of an object. at NHibernate.Collection.PersistentList.GetSnapshot(ICollectionPersister persister) at NHibernate.Engine.CollectionEntry..ctor(ICollectionPersister persister, IPersistentCollection collection) at NHibernate.Engine.StatefulPersistenceContext.AddNewCollection(ICollectionPersister persister, IPersistentCollection collection) at NHibernate.Event.Default.WrapVisitor.ProcessArrayOrNewCollection(Object collection, CollectionType collectionType) at NHibernate.Event.Default.WrapVisitor.ProcessCollection(Object collection, CollectionType collectionType) at NHibernate.Event.Default.AbstractVisitor.ProcessValue(Object value, IType type) at NHibernate.Event.Default.WrapVisitor.ProcessValue(Int32 i, Object[] values, IType[] types) at NHibernate.Event.Default.AbstractVisitor.ProcessEntityPropertyValues(Object[] values, IType[] types) at NHibernate.Event.Default.AbstractSaveEventListener.VisitCollectionsBeforeSave(Object entity, Object id, Object[] values, IType[] types, IEventSource source) at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) at NHibernate.Impl.SessionImpl.Save(Object obj)
What am I doing wrong here?
Clarification: this is how I use classes:
var a = new A { MyChildren = new List<B> { new B { TheDate = DateTime.Now } } }; a.MyChildren[0].Parent = a; session.Save(a);