Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

NHibernate: IList convertita in NHibernate.Collection.Bag...

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

Print | posted on domenica 18 giugno 2006 00:32 | Filed Under [ Sviluppo .NET ]

Feedback

Gravatar

# re: NHibernate: IList convertita in NHibernate.Collection.Bag...

Igor le cose ti sembreranno sempre strane fino a quando non leggerai "un po" la documentazione di NHibernate! :-)

PS:
Un oggetto interfaccia è solo un segnaposto. A runtime deve sempre essere rappresentato da un tipo reale.
Si chiama "polimorfismo con i fiocchi"!
Leggi il mio post!
19/06/2006 12:49 | Giancarlo Sudano
Gravatar

# re: NHibernate: IList convertita in NHibernate.Collection.Bag...

Janky, lo so bene...
però il mio problema è ancora più strano: se rileggo un singolo business object con NHibernate, e lo salvo, tutto ok.
Se invece il mio business object lo prelevo da una lista ritornata da NHibernate, e lo salvo...ho strani errori di cui non riesco a capire il motivo. Ma magari ne parleremo su Messenger.
:-)
19/06/2006 18:09 | Igor Damiani
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET