Questa mattina ho riscontrato un problema che deriva un
po' da quello che ho descritto nei miei ultimi 3 post relativi ad NHibernate.
Immaginate di avere una classe che espone una proprietà di tipo
IList, per implementare una relazione uno-a-molti tra una
classe father ed una classe child.
Immaginiamo di aver costruito un opportuno file di mapping per salvare questa
classe, e la corrispondente classe figlia. Una delle caratteristiche di
NHibernate è quella di poter restituire una lista di oggetti di questa nostra
classe, perchè il file di mapping lo permette. Quindi, per esempio, possiamo
scrivere codice simile a questo:
session = factory.OpenSession();
ICriteria criteria = session.CreateCriteria(typeof(AttoVendita));
IList list = criteria.List();
AttoVenditaCollection ret = new AttoVenditaCollection();
foreach (AttoVendita element in list)
ret.Add(element);
Con il blocco di codice qui sopra, diciamo ad NHibernate di restituirci un
oggetto AttoVenditaCollection, che non è nient'altro che una
lista di oggetti AttoVendita. La cosa strana, a cui penserò
lunedì prossimo, è che prelevando un AttoVendita da questa
lista in questo modo:
AttoVendita av =(AttoVendita)ret[0];
il codice compila correttamente, solo che la proprietà che all'inizio era di
tipo IList (che è un'interfaccia e quindi non può essere
fisicamente istanziata) è diventata di tipo
NHibernate.Collection.Bag. Questo non è un dramma, perchè
NHibernate.Collection.Bag può essere comunque castata a
IList. Ma la cosa che mi ha procurato qualche dubbio è che
tentando di risalvare la stessa entità prelavata dalla lista, otteniamo un
errore dell'engine di NHibernate, che riporto qui sotto:
Illegal attempt to associate a collection with two open sessions
Adesso non ho proprio tempo (gli USA hanno appena pareggiato, e De Rossi
appena espulso ), vado fuori a bermi una birra. Questo è sicuramente
il post tecnico più impreciso che abbia mai scritto, perdonatemi, ma mi servirà
anche come appunti per quando ricomincerò il lavoro la prossima
volta.
powered by IMHO 1.3