2012-08-01 24 views
7

Tengo un problema al cargar una colección. La configuración que tengo es una simple asociación de uno a varios, asignada mediante FluentNHibernate. La entidad se carga con la excepción suficiente lanzada, pero el acceso a la colección relacionada muestra "acceso ilegal a la colección de carga". Pegaré una parte relevante del código aquí.Carga de la colección NHibernate, "acceso ilegal a la colección de carga"

[Serializable] 
[DataContract(IsReference = true)] 
public partial class Department : Entity 
{ 
    ... 
    [DataMember] 
    public virtual IList<PressJobRun> PressJobRun 
    { 
     get { return pressJobRunField; } 
     protected set { pressJobRunField = value; } 
    } 
    ... 
} 

asignan de la siguiente manera

public DepartmentMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name) 
     .Not.Nullable() 
     .Length(100); 
    HasMany(x => x.PressJobRun) 
     .AsBag() 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .LazyLoad() 
     .BatchSize(50); 
    ... 
} 

También he intentado desactivar la carga diferida, mediante la exclusión de la línea y llamando .Not.LazyLoad(), sin embargo final es el mismo.

using (var tx = m_Repository.Session.BeginTransaction()) 
    { 
     var depts = m_Repository.Session.CreateCriteria<Department>().List<Department>(); 
     var dept = depts[0]; 
     ... 
    } 

Soy consciente de la exposición de sesión no es lo que hay que hacer, pero esto fue en los intentos para asegurarse de que la sesión está abierta.

Cuando desglosar la excepción que veo seguimiento de pila:

at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) 
    at NHibernate.Collection.AbstractPersistentCollection.Read() 
    at NHibernate.Collection.AbstractPersistentCollection.ReadSize() 
    at NHibernate.Collection.PersistentBag.get_Count() 
    at NHibernate.DebugHelpers.CollectionProxy`1.get_Items() 

El Gremlin interesante viene aquí. Establecí el punto de interrupción en la línea setter de la propiedad PressJobRun.

  • si camino sobre ella y reloj rápida pressJobRunField, veo el "acceso ilegal a excepción de carga".
  • si observo por primera vez la variable value, veo la colección cargada. Pasar por encima de la línea setter funciona como se esperaba.

Lo que yo uso

  • Visual Studio 2012, dirigido a .NET 4
  • NHibernate 3.3.1.400
  • SQL CE 4
  • Castillo
  • Castillo AutoTx facitlity
  • Administro la sesión p er WCF solicitar a mí mismo

Lo que he tratado

  • desactivación de la carga diferida
  • asegurado de que la sesión está abierta, y que se trata de una misma sesión durante la ejecución de código erróneo
  • alternó Inverted mapa de la colección (pensé que debería invertirse)
  • solución limpiada y reconstruida
  • se aseguró en Configuration Manager de que todos los proyectos en solución se están construyendo
  • configuran el depurador para romper todas las excepciones lanzadas.Depurador no se rompe con la excepción de que yo vea SET en la recolección de

Respuesta

3

El problema es que cuando PressJobRub.Department propiedad se establece, mi código también añade la PressJobRun de recogida adecuados Department. Inicialicé la colección, pero el problema fue que la colección que utiliza NHibernate falla por alguna razón al llamar al método Contains(). Todavía estoy sorprendido sobre el gremlin que describí en la pregunta, y por qué el depurador no se rompió en la excepción cuando desactivé 'Habilite solo mi código para depurar' y lo configuré para romper en Thrown excepciones también.

En cualquier caso, la solución es mapear PressJobRun.Department acceso al campo (en mi caso a Access.PascalCaseField(Prefix.mUnderscore)) con el fin de evitar la llamada que se suma a la entidad Department.PressJobRun colección.

Krzysztof Kozmic's article explicado esto, aunque en mi caso no fue recogida sin inicializar.

Cuestiones relacionadas