Pregunta

En mi aplicación, configuré un mapeo de diccionario ternario para que para un usuario determinado, pueda recuperar "configuraciones" para cada instancia de un objeto que pertenece al usuario. Es decir, tengo algo como:

public class User
{
    public virtual IDictionary<Baz, BazSettings> BazSettings { get; set; }

    //...

Entonces cuando tengo un Baz Objeto, puedo buscar la configuración BAZ del usuario actual a través de currentUser.BazSettings[baz].

Me gustaría poder usar una sesión sin estado para hacer esto, pero obtengo un LazyInitializationException con este código:

//int bazId;
using (IStatelessSession session = Global.SessionFactory.OpenStatelessSession())
{
    var currentUser = session.Get<User>(Membership.GetUser().ProviderUserKey);
    var baz = session.Get<Baz>(bazId);
    var bazSettings = currentUser.BazSettings[baz]; // raises `LazyInitializationException`

Cuando uso en su lugar un ISession, entonces el problema desaparece.

El mensaje de error NHibernate completo incluye el texto "No se cerró la sesión o la sesión". Esto tiene sentido porque al usar una sesión sin estado, las entidades no están conectadas a la sesión. Sin embargo, creo que hay una manera de usar la sesión sin estado para realizar esta búsqueda.

¿Cómo uso una sesión sin estado para realizar la búsqueda? currentUser.BazSettings[baz]?

¿Fue útil?

Solución

Las sesiones sin estado no admiten la carga perezosa, exactamente porque son apátrida: no rastrean cualquier cosa sobre las entidades recuperadas con ellos.

La única forma de hacer que funcione es ansioso por cargar la colección. Pero por que tú desear ¿Para usar sesiones sin estado, si claramente no proporcionan lo que necesita?

Otros consejos

Debe usar iSession en lugar de Istatelesssion porque las operaciones realizadas con una sesión sin estado no están cascade en instancias y colecciones asociadas son ignoradas por una sesión sin estado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top