我有以下类和流畅的映射:
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);
}
}
这导致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>
但是当我真正尝试保存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<B> { new B { TheDate = DateTime.Now } } };
a.MyChildren[0].Parent = a;
session.Save(a);
答案 0 :(得分:1)
您应该将MyChildren = New List<B>();
添加到A
答案 1 :(得分:0)
对于子集合,您的键列不应该是“Id”(而不是“AId”)吗?我认为这是你问题的根源......
答案 2 :(得分:0)
我想出来了。上面的示例确实有效,但我试图重现的问题仍在运行,导致同样的错误。对不起...
问题是我们创建了这个ChildList类,我们为MyChildren属性返回了这个类。它只是包装List(或NHibernate用于持久列表的任何具体列表),但它负责在集合中添加或删除的任何实例上设置Parent属性。
显然,在保存新实例时会导致NHibernate问题。返回正常的具体列表有效。