Fluent Nhibernate - Listing results in a NullReferenceException?

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); 
+1
source share
3 answers

I get it. The example above really works, but the problem I tried to reproduce still works, causing the same error. Sorry for that...

The problem is that we created this ChildList class, which we returned for the MyChildren property. He simply wrapped the List (or NHibernate uses a specific list for permanent lists), but he took care to set the Parent property to any instance that was added or removed from the collection.

This seems to cause NHibernate problems when saving even a new instance. Return a normal specific list.

0
source

You must add MyChildren = New List<B>(); to your constructor for A

+1
source

Wouldn't your key column be “Id” (as opposed to “AId”) for the kids collection? I think this is the source of your problem ...

0
source

Source: https://habr.com/ru/post/1445954/


All Articles