[NHibernate]Een object zichzelf laten vullen

Pagina: 1
Acties:

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 14-11 22:24
Hallo allemaal,

Ik ben bezig met NHibernate en probeer iets te maken wat niet helemaal lukt. Ik heb een Class die een Object vertegenwoordigt wat ik via NHibernate uit de database wil halen.

Het volgende gaat goed en het object wordt gevuld:

C#:
1
2
Object obj = new Object();
obj = (Object)ISession.Get(obj.GetType(), 1);


Alleen nu wil ik dus dat ISession.Get() in de class zelf doen. Dus zo:

C#:
1
2
Object obj = new Object();
obj.Init(1);


Dit omdat dit in een oude versie van het programma zo werkt en deze library met dat programma moet gaan werken.

Alleen krijg ik het niet goed voor elkaar om het object te vullen. Ik heb bijvoorbeeld dit:

C#:
1
2
3
4
public void Init(Object Key) {
  Object temp = this;
  temp = (Object)ISession.Get(temp.GetType(), 1);
}


Eerst had ik trouwens dit:

C#:
1
2
3
public void Init(Object Key) {
  this = (Object)ISession.Get(this.GetType(), 1);
}


Maar dat mag helemaal niet omdat je niet aan this kan toekennen. Nu kan ik wel alle properties stuk voor stuk nalopen en die individueel toekennen maar dat lijkt me ook niet zo'n goeie oplossing.
Zo gauw als ik uit de Init functie stap ben ik de opgehaalde gegevens weer kwijt :? Waarom is dat? Of kan dit gewoon niet wat ik wil?

[ Voor 14% gewijzigd door urk_forever op 12-06-2008 20:24 ]

Hail to the king baby!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Wat je in je eerste stukje code doet is niet het object gebruiken, maar een nieuwe maken. De obj in regel 1 is dus ook een compleet andere instantie als die in regel 2.

Wat je in je derde stuk code doet is dan ook niks anders dan een tweede object maken waar je vervolgens niks mee doet. Het is onmogelijk om 'this' te vervangen. Het feit dat je het resultaat niet rechtstreeks aan 'this' toe kan kennen had je natuurlijk al een hint kunnen geven. Als je deze, hoogst ongebruikelijke, manier toe wilt passen dan zul je moeten kijken of je iets als refresh of revert kunt doen. Hierbij haal je neit een nieuw object op, maar vul je de properties van je bestaande object.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:26
Wat jij wil, is dus een soort van ActiveRecord pattern ?
Kijk dan eens naar Castle ActiveRecord. Doet precies wat jij wilt, en gebruikt NHibernate.

[ Voor 15% gewijzigd door whoami op 12-06-2008 20:45 ]

https://fgheysels.github.io/


  • alwinuzz
  • Registratie: April 2008
  • Laatst online: 17-11 10:14
ActiveRecord is heerlijk, maakt NH veel makkelijker. Ik vind het trouwens niet precies de oplossing voor wat je vraagt, maar het is sowieso een aanrader :)

Weet niet zeker of het werkt, aangezien ik nooit op deze manier een object init. Zou moeten kunnen, aangezien http://www.hibernate.org/...refresh(java.lang.Object) zegt dat een 'detached' instance ook gerefreshed kan worden.

C#:
1
2
3
4
int id = 123;
User user = new User(); 
user.Id = id; // normaal is dit niet zo'n goed idee denk ik
ActiveRecordMediator<User>.Refresh(user); // of DeNhSession.Refresh(user);