Fluent Nhibernate – 映射列表会导致NullReferenceException?

我有以下类和流畅的映射:

public class A { public virtual int Id { get; private set; } public virtual string MyString { 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.MyString); 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); } } 

这导致A的以下映射:

                    

但是当我实际尝试保存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) 

我在这做错了什么?

澄清:这就是我使用这些类的方式:

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

你应该添加MyChildren = New List(); 到你的构造函数

对于子集合,您的密钥列不应该是“Id”(而不是“AId”)吗? 我认为这是你问题的根源……

我想出来了。 上面的示例确实有效,但我试图重现的问题仍在运行,导致同样的错误。 对于那个很抱歉…

问题是我们创建了这个ChildList类,我们为MyChildren属性返回了这个类。 它只是包装List(或NHibernate用于持久列表的任何具体列表),但它负责在从集合中添加或删除的任何实例上设置Parent属性。

显然,这甚至在保存新实例时会导致NHibernate问题。 返回正常的具体列表有效。