Fluent Nhibernate – Le mappage d’une liste entraîne NullReferenceException?

J’ai les classes et les mappages courants suivants:

public class A { public virtual int Id { get; private set; } public virtual ssortingng MySsortingng { get; set; } public virtual IList MyChildren { get; set; } } public class B { public virtual int Id { get; private set; } public virtual DateTime TheDate { get; set; } } public sealed class AMap : ClassMap { public AMap() { Id(x => x.Id).GeneratedBy.Native().UnsavedValue(0); Map(x => x.MySsortingng); HasMany(x => x.MyChildren).AsList(x => x.Column("Ordinal")).KeyColumn("AId").Not.KeyNullable(); } } public sealed class BMap : ClassMap { public BMap() { Id(x => x.Id).GeneratedBy.Native().UnsavedValue(0); Map(x => x.TheDate); } } 

Cela se traduit par le mappage suivant pour A:

                    

Mais lorsque j’essaie réellement de sauvegarder une instance de A, j’obtiens une 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, Ssortingng 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) 

Qu’est-ce que je fais mal ici?

Précision: Voici comment j’utilise les classes:

 var a = new A { MyChildren = new List { new B { TheDate = DateTime.Now } } }; a.MyChildren[0].Parent = a; session.Save(a); 

Vous devez append MyChildren = New List(); à votre constructeur pour A

Votre colonne de clé ne devrait-elle pas être “Id” (par opposition à “AId”) pour la collection enfant? Je pense que c’est la source de votre problème …

Je l’ai compris. L’exemple ci-dessus fonctionne réellement, mais le problème que je tentais de reproduire était toujours en cours d’exécution, provoquant la même erreur. Désolé pour ça…

Le problème est que nous avons créé cette classe ChildList, que nous avons renvoyée pour la propriété MyChildren. Elle encapsulait simplement la liste (ou toute liste concrète utilisée par NHibernate pour les listes persistantes), mais elle se chargeait de définir la propriété Parent sur toute instance ajoutée ou supprimée de la collection.

Apparemment, cela pose des problèmes à NHibernate lors de la sauvegarde même d’une nouvelle instance. Renvoyer une liste concrète normale fonctionne.