Búsqueda perezosa de un valor de diccionario usando una sesión sin estado
-
23-10-2019 - |
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]
?
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.