流利Nhibernate - 映射列表结果NullReferenceException? [英] Fluent Nhibernate - Mapping a list results in NullReferenceException?

查看:121
本文介绍了流利Nhibernate - 映射列表结果NullReferenceException?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  public class A {
public virtual int Id {get ;私人设置}
public virtual string MyString {get;组; }
公共虚拟IList< B> MyChildren {get;组; }
}

public class B {
public virtual int Id {get;私人设置}
public virtual DateTime TheDate {get;组; }
}

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);






$ p $这导致下面的A映射: p>

 < class xmlns =urn:nhibernate-mapping-2.2mutable =truename =Atable =` A`> 
< id name =Idtype =System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089unsaved-value =0>
< column name =Id/>
< generator class =native/>
< / id>
< property name =MyStringtype =AnsiString>
< column name =MyStringlength =150not-null =true/>
< / property>
< list name =MyChildrenmutable =true>
< key not-null =true>
< column name =AId/>
< / key>
< index>
< column name =Ordinal/>
< / index>
<一对多等级=B/>
< / list>
< / class>

但是当我真正尝试保存A的一个实例时,我得到了一个 NullReferenceException

  System.NullReferenceException:未将对象引用设置为对象的实例。 $ NHibernate.Collection.PersistentList.GetSnapshot(ICollectionPersister persister)
NHibernate.Engine.CollectionEntry..ctor(ICollectionPersister persister,IPersistentCollection集合)
NHibernate.Engine.StatefulPersistenceContext.AddNewCollection
(ICollectionPersister persist,IPersistentCollection集合)
在NHibernate.Event.Default.WrapVisitor.ProcessArrayOrNewCollection(对象集合,CollectionType集合类型)$ b $在NHibernate.Event.Default.WrapVisitor.ProcessCollection(对象集合,CollectionType集合类型)
在NHibernate.Event.Default.AbstractVisitor.ProcessValue(对象值,IType类型)
在NHibernate.Event.Default.WrapVisitor.ProcessValue(Int32我,对象[]值,IType []类型)
在NHibernate.Event.Default.AbstractSaveEventListener.VisitCollectionsBeforeSave(对象实体,对象ID,对象[]值),在NHibernate.Event.Default.AbstractVisitor.ProcessEntityPropertyValues(对象[]值,IType []类型)
, IType []类型,IEventSource源)
在NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(对象实体,EntityKey键,IEntityPersister持久性,布尔useIdentityColumn,对象任何东西,IEventSource源,布尔requireImmediateIdAccess) .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 ,任何对象,IEventSource源,布尔requiresImmediateIdAccess)
在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件)
在NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件)
在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTra在NHibernate.Impl的$ NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent事件)
$ NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent事件)
。 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);


解决方案

上面的示例实际上可以工作,但是我试图重现的问题仍在运行,导致相同的错误。对不起...



问题是我们创建了这个ChildList类,我们返回MyChildren属性。它简单地包装了List(或NHibernate用于持久化列表的任何具体列表),但是它在设置任何实例被添加或从集合中移除的Parent属性时都很谨慎。



<显然这会在保存新实例时导致NHibernate问题。返回一个正常的混凝土名单的作品。


I have the following classes and fluent 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 results in 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 actually 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'm using the classes:

var a = new A { MyChildren = new List<B> { new B { TheDate = DateTime.Now } } };
a.MyChildren[0].Parent = a;

session.Save(a);

解决方案

I figured this out. The sample above actually does work, but the issue I was trying to reproduce was still running, causing the same error. Sorry about that...

The issue is that we had created this ChildList class, which we returned for the MyChildren property. It simply wrapped the List (or whatever concrete list NHibernate uses for persistent lists), but it took care of setting the Parent property on whatever instance was added or removed from the collection.

Apparently this causes NHibernate problems when saving even a new instance. Returning a normal concrete List works.

这篇关于流利Nhibernate - 映射列表结果NullReferenceException?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆