2010-11-16 17 views
6

No he podido encontrar una respuesta a este problema así que supongo que es algo que estoy haciendo mal.Fluidez NHibernate LazyLoad Issues

Tengo un PersistenceModel configurar donde he establecido una convención de la siguiente manera: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

Sin embargo, para una de las relaciones HasManyToMany en uno de mis entidades Quiero carga dispuestos a tomar lugar que yo soy la creación de la siguiente manera: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

Intuitivamente, espero carga deseosos de tener lugar como estoy anulando el valor predeterminado de carga perezosa que he especificado como una convención, sino que carga todavía perezosos. Si configuro la convención DefaultLazy nunca y luego configuro LazyLoad en una relación individual, tampoco funciona.

¿Alguna idea?

Respuesta

9

Cuando configura Not.LazyLoad(), le dice a NHibernate que cargue Afiliados cuando el padre se carga. NHibernate hará esto al realizar otra selección en la tabla muchos a muchos de Affliates independientemente de si accede a la colección Affiliates o no. NHibernate está utilizando otra selección porque ese es el modo de búsqueda predeterminado. También desea sobrescribir el modo de búsqueda, ya sea en la consulta o en la asignación. Para hacerlo en el mapeo, añada lo siguiente:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

También puede ser que desee incluir una ".Cascade.AllDeleteOrphan()" si desea NHibernate persista nueva Affiliaites añadió a la colección y eliminar los huérfanos. Si no lo hace, deberá llamar explícitamente a session.Save (newAffiliate). De lo contrario, recibirá una excepción TransientObjectException cuando su colección de afiliados contenga un nuevo afiliado.

+0

Lo siento, eliminé las partes del código que no pensé que fueran relevantes aquí. Tengo .FetchType.Join() también y apagando la carga lenta aún no funciona. La única manera de desactivar la carga diferida que he descubierto es que funciona para mí configurando la convención. – Dotnet

+0

Agregué la convención DefaultLazy.Always() y la relación HasManyToMany() está ansiosamente cargada cuando se aplica Fetch.Join(). Puede tomar mi muestra de GitHub aquí: https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ –

+0

De acuerdo, bueno, prácticamente imité su código en mi situación y todavía no funcionaba, así que tendré que mirar más de cerca. Estoy usando .ShowSql() para determinar si las consultas se han ejecutado de forma lenta o ansiosa, y supongo que son precisas. – Dotnet

0

Puede ser una pregunta estúpida, pero ¿has ejecutado la consulta dentro de tu sesión? Decir,

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

he tenido este problema antes, y finalmente se dieron cuenta de los objetos no había sido consultado antes de desechar la sesión que estaba accediendo.

Cuestiones relacionadas