[NHibernate] Updaten van bestaande objecten lukt niet

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Ik heb alweer een probleem met NHibernate :/

Ik kan nu wel (nieuwe) 'container' objecten en hun items saven in de databank (klik), maar het updaten lukt blijkbaar niet...

Als ik op deze manier een nieuw item in de DB wil opslaan, dan gaat dat zonder problemen.
code:
1
2
3
4
5
6
7
8
9
10
Container c = new Container();
c.Name = "bliep";
Item it = new Item();
it.Name = "item1";
it.Price = 12;
c.AddItem(it);

ISession s = sessFact.OpenSession();
s.Save (c);
s.Close();

Hier zie ik mbhv SQL profiler dat er 2 insert queries uitgevoerd worden, en de 2 objecten staan ook correct in de DB.
Ik kan ze ook ophalen mbhv nhibernate.

Echter, het probleem doet 'm nu voor als ik een bestaand object uit de DB haal, en deze wil wijzigen en opslaan.
Ik heb als test een scherm gemaakt, waarin al m'n containers in een listview getoond worden. Deze lijst heb ik gewoon quick'n dirty opgehaald, door rechtstreeks met een data-reader te werken.
Als ik een item selecteer, dan haal ik het 'container' object op dmv hibernate, en toon het de container in een 'detail-scherm': ik toon z'n naam in een TextBox, en de Items die in deze container zitten in een ListView.
Als ik op de 'OK' button klik op dat detail scherm, dan wil ik dat de wijzigingen opgeslagen worden.
Even wat relevante code:
In de double-click event op de ListView van het 'overzichtsscherm' staat deze code:
code:
1
2
3
4
5
6
ISession s = sessFact.OpenSession();
Container c = (TestModel.Container)s.Get(typeof(TestModel.Container), listView1.SelectedItems[0].Tag);
s.Close();

frmContainerDetail f = new frmContainerDetail();
f.Execute (c);


De Execute(Container c) method van frmContainerDetail is gewoon een method die er zo uit ziet:
code:
1
2
3
4
5
void Execute( Container c )
{
   _container = c;
   textBox1.Text = c.Name;
}


Nu heb ik dus de 'OK button', waarmee ik de wijzingen die op de form zijn gebeurd wil opslaan:
code:
1
2
3
4
5
6
7
8
public void btnOk_Click(object sender, EventArgs e )
{
   _container.Name = textBox1.Text;

   ISession s = sessFact.OpenSession();
   s.SaveOrUpdate (_container);
   s.Close();
}

Als deze code uitgevoerd wordt, wordt er dus niets ge-updated. Als ik in de profiler ga kijken, zie ik ook geen insert/update statements voorbij vliegen.

Ik heb dan maar ff m'n code in de btnOk-click vervangen door dit:
code:
1
2
3
4
5
ISession s = sessFact.OpenSession();
_container = (Container)s.Get(typeof(Container), _container.Id);
_container.Name = textBox1.Text;
s.SaveOrUpdate (_container);
s.Close();

maar ook hier wordt er niets geupdated, terwijl ik toch wel zou verwachten dat het hier wel gebeurd. Hier haal ik nl. het 'originele' object uit de DB, wijzig het en update het binnen dezelfde sessie ?

Ik dacht nl dat m'n eerste test niet lukte omdat het object gesaved werd binnen een andere sessie dan de sessie waarin het opgehaald werd, maar blijkbaar is er toch nog wat anders a/d hand ?

[ Voor 4% gewijzigd door whoami op 13-11-2005 12:10 ]

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

Lukt het ook niet met alleen een update ipv een saveOrUpdate ?

En probeer anders eens met een transactie... dus:
sessie openen, transactie openen, container ophalen, container aanpassen, updaten, transactie committen en sessie sluiten.

Neem je whisky mee, is het te weinig... *zucht*


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Het aanroepen van SaveOrUpdate() is niets meer dan markeren van objecten in de huidige unit-of-work. Pas bij het aanroepen van ISession.Flush() wordt de unit-of-work in zijn geheel gesaved. Die Flush() ontbreekt dus nog. Als je expliciet transacties gebruikt zorgt in dat geval de Commit() er voor de flush.

Dat het in je eerste voorbeeld met de Save() wel lukt zal kunnen gebeuren als de PK als identity gedefinieerd is. Dit is de enige situatie in NHibernate waarbij een Save() direct resulteert in een database actie om de waarde van de primary key te achterhalen.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Die flush deed 't hem inderdaad. Vreemd, want ik dacht toch dat ik daar gisteren ook al eens mee gespeeld had...

In een transactie plaatsen zal dan ook wel lukken.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Strange, het updaten lukt nu wel, maar ik zie dat er 3 UPDATE statements uitgevoerd worden:
ééntje om m'n 'Container' record up te daten, en voor ieder item die in m'n container zit, ook één. Dit terwijl ik echter niets aan m'n items gewijzigd heb...

Ook bij 'Containers' die geen 'items' hebben, word er een update statement uitgevoerd, als ik niets aan m'n container veranderd heb.
Dit gebeurd wel enkel als ik m'n 'container' op een form getoond heb. Ik ben er wel quasi zeker van dat er niets aan m'n 'fields' van m'n objectn is veranderd.

Als ik gewoon een container ophaal, en dan 'SaveOrUpdate' call, dan wordt er niets gesaved (ik heb er ook niets aan veranderd).

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

Heb je het dan over 'containers' die in de zelfde sessie ook geladen zijn?

Want dan zou het niet mogen nml.
Als de containers uit de ene sessie komen en je probeerd ze in de volgende sessie te updaten, zijn ze per definitie 'dirty' en wordt alles dus meegenomen :)

Updaten van een object moet je altijd doen in de sessie waarin deze geladen is. Alleen de aanpassingen zijn dan 'dirty' en worden met de flush meegenomen :)

Bij het event dat de update doet, dus even op id je container opnieuw laden zou voldoende moeten zijn. :)

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Hmm, ze worden idd in een andere sessie ge-updated.
(Ik haal ze op, close m'n sessie, toon ze in een ander form, en als daar op 'ok' geklikt wordt, dan wordt er een nieuwe sessie geopend, en worden SaveOrUpdate() gecalled.

Nu je het zegt is het op zich best logisch, aangezien een ISession een UoW is. Echter vind ik het wel vervelend. :P Ik kan de sessie waarin ik het object heb ingeladen niet zo lang 'open' houden. Ik weet nl. niet hoelang deze 'open' zou blijven. Dat zou bij wijze van spreken 'oneindig' kunnen zijn. (Als de gebruiker die form uren laat openstaan bv...).

Aan de andere kant: teveel updaten is ook zo stom, en bovendien onwenselijk.
Echter, voor ik 'SaveOrUpdate' oproep, eerst nog eens het betreffende object gaan ophalen is ook niet alles... Ten eerste doe je eigenlijk een onnodige query, en ten 2de, en belangrijker: hiermee omzeil je eigenlijk evt concurrency problematiek denk ik...

Wat als er een andere gebruiker het betreffende object ondertussen heeft gewijzigd in de tijd dat jij het open had staan op je scherm ?
Aangezien je eerst het object ophaalt, en het daarna saved, dan ben je je check kwijt waarmee je kijkt of een andere gebruiker het betreffende record ondertussen aangepast heeft.

En als ik gebruik maak van databinding, dan is dat eigenlijk ook geen goede oplossing... (Databinding zorgt er nl. voor dat de wijzigingen die ik gemaakt heb, automatisch in m'n object geplaatst worden. Als ik dan eerst het 'oorspronkelijke' record ophaal uit de DB, dan zou ik toch nog alle properties manueel moeten gaan zetten.

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

Dit is wel interessant voor je om te lezen: http://www.hibernate.org/...en/html/transactions.html
(weer de normale hibernate docs ;) )

Bespreekt ook deels jou probleem waar je met objecten zit uit een andere sessie die moeten worden ge-update :)

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Aha, ik kan dus m'n onderliggende ADO.NET connectie sluiten, maar m'n NHibernate ISession open houden zolang als ik m'n form openhou, dat kan geen kwaad ?

De execute method van m'n form ziet er bv zo uit:
code:
1
2
3
4
5
6
7
8
9
10
public void Execute( int containerId )
{
     // _session is een member variable van m'n form.
      _session = AppSettings.Instance.SessionFactoryObj.OpenSession();

      _container = (Container)_session.Get(typeof(Container), containerId);
 
      _session.Disconnect();

}


De code achter m'n OK button click ziet er dan zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
public void OkButtonClick()
{
     if( _session.IsConnected == false )
     {
          _session.Reconnect();
     }

     _session.SaveOrUpdate (_container);
     _session.Flush();
     _session.Close();
}


code is allemaal zo ff uit de losse hand, gewoon ff voor de globale werkwijze aan te tonen.

Ok, eigenlijk zou er ook transaction handling moeten inzitten, en dan hoef ik _session.Flush niet meer aan te roepen, etc...
En eigenlijk zou ik het ophalen en saven van gegevens ook niet in m'n form mogen doen, maar zou ik van een repository pattern gebruik moeten maken).

Thx voor de hulp en tips iig. :)

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

whoami schreef op zondag 13 november 2005 @ 17:18:
Aha, ik kan dus m'n onderliggende ADO.NET connectie sluiten, maar m'n NHibernate ISession open houden zolang als ik m'n form openhou, dat kan geen kwaad ?
Je kan ook de sessie sluiten :) Dan werk je met 'detached' objecten.

Kijk maar bij het kopje: 12.3.3. Detached objects and automatic versioning

Neem je whisky mee, is het te weinig... *zucht*


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Ook al kun je reconnecten, het is niet verstandig op de sessies lang te laten bestaan. Dit levert op termijn allerhande problemen op met stale data (vooral in multi-user scenarios) en als je sessie eruit knalt vanwege een concurrency probleem kun je niets anders doen dan een nieuwe sessie te openen en weer opnieuw te beginnen.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
momania schreef op zondag 13 november 2005 @ 17:25:
[...]

Je kan ook de sessie sluiten :) Dan werk je met 'detached' objecten.

Kijk maar bij het kopje: 12.3.3. Detached objects and automatic versioning
Dat was ik net ff a/h lezen, en aan het testen, maar, als je databinding gebruikt, wil dat nog niet zo goed lukken. (Of ik moet iets verkeerd doen).

Als ik m'n detached object terug re-attach mbhv 'Lock' en als LockMode Read opgeef, dan wordt m'n object opnieuw gelezen uit de DB, maar dan ziet het er naar uit dat ik m'n wijzingen ook kwijt ben, en het object is dus niet dirty.
Als ik als lockmode 'none' opgeef, dan gebeurt er ook niet veel...

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
tijn schreef op zondag 13 november 2005 @ 17:28:
Ook al kun je reconnecten, het is niet verstandig op de sessies lang te laten bestaan. Dit levert op termijn allerhande problemen op met stale data (vooral in multi-user scenarios) en als je sessie eruit knalt vanwege een concurrency probleem kun je niets anders doen dan een nieuwe sessie te openen en weer opnieuw te beginnen.
Is dat dan zo'n probleem ?
Als user A een object leest, z'n scherm een tijdje laat openstaan, en daarna saved, en user B heeft in de tijd dat user A z'n form liet open staan, datzelfde object gewijzigd, dan is het toch logisch dat user A een concurrency exception voor de kiezen krijgt ?
Dat hij dan z'n werk 'kwijt' is, is toch een logisch gevolg van optimistic concurrency ? Dat hij dan z'n form moet afsluiten, en het object moet heropenen is imho dan toch gewoon logisch. Op dat moment heeft hij natuurlijk een nieuwe Session.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
whoami schreef op zondag 13 november 2005 @ 17:35:
[...]


Dat was ik net ff a/h lezen, en aan het testen, maar, als je databinding gebruikt, wil dat nog niet zo goed lukken. (Of ik moet iets verkeerd doen).

Als ik m'n detached object terug re-attach mbhv 'Lock' en als LockMode Read opgeef, dan wordt m'n object opnieuw gelezen uit de DB, maar dan ziet het er naar uit dat ik m'n wijzingen ook kwijt ben, en het object is dus niet dirty.
Als ik als lockmode 'none' opgeef, dan gebeurt er ook niet veel...
Ik zou dit misschien kunnen oplossen door in m'n 'container detail form', 2 instances van dezelfde container op te halen / bij te houden.
Eentje die ik gewoon gebruik als 'original values', en eentje die ik gebruik om daadwerkelijk spul te wijzigen...

edit:
hmmm, dat blijkt toch niet te werken


Met detached objecten werken doe ik zo:
code:
1
2
3
4
5
6
7
8
public void OkButtonClick()
{
   // _container is detached, since it has been loaded in another session which is already closed
   ISession s = sessionFactoryObj.OpenSession();
   s.Lock(_container, LockMode.None);
   s.SaveOrUpdate (_container);
   ....
}


Als ik geen gebruik maak van databinding, dan lukt het natuurlijk wel:

code:
1
2
3
4
5
6
7
8
public void OkButtonClick()
{
    ISession s = sessFactory.OpenSession();
    s.Lock (_container, LockMode.None);
    _container.Name = txtName.Text;
    s.SaveOrUpdate (_container);
    ....
}

[ Voor 30% gewijzigd door whoami op 13-11-2005 18:25 ]

https://fgheysels.github.io/


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Bij databinding moet het ook gewoon lukken hoor. Alleen even niet vergeten om EndCurrenEdit() van de currencymanager aan te roepen.

Cuyahoga .NET website framework


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
whoami schreef op zondag 13 november 2005 @ 17:40:
Is dat dan zo'n probleem ?
Als user A een object leest, z'n scherm een tijdje laat openstaan, en daarna saved, en user B heeft in de tijd dat user A z'n form liet open staan, datzelfde object gewijzigd, dan is het toch logisch dat user A een concurrency exception voor de kiezen krijgt ?
Dat hij dan z'n werk 'kwijt' is, is toch een logisch gevolg van optimistic concurrency ? Dat hij dan z'n form moet afsluiten, en het object moet heropenen is imho dan toch gewoon logisch. Op dat moment heeft hij natuurlijk een nieuwe Session.
Nou ja, bij formpjes waar je 1 entity wijzigt is dat geen probleem, maar als je bijvoorbeeld een complete order incl. orderregels kwijt raakt, vinden gebruikers dat best wel naar.

Cuyahoga .NET website framework


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Leuk he, POCO :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
tijn schreef op zondag 13 november 2005 @ 18:51:
Bij databinding moet het ook gewoon lukken hoor. Alleen even niet vergeten om EndCurrenEdit() van de currencymanager aan te roepen.
Dat lukt niet, aangezien, als ik mbhv Session.Lock m'n detached object aan m'n sessie 'hang', het al de waardes bevat die gewijzigd zijn (en dus niet de originele waarden).
Daardoor ziet hibernate m'n object dus niet als dirty.
Tja...
Iedere keer zelf een DAL schrijven is ook niet je van het, en generators gebruik ik liever niet.
tijn schreef op zondag 13 november 2005 @ 18:54:
[...]


Nou ja, bij formpjes waar je 1 entity wijzigt is dat geen probleem, maar als je bijvoorbeeld een complete order incl. orderregels kwijt raakt, vinden gebruikers dat best wel naar.
Ja, maar als je een concurrency-exception hebt op die order, dan ben je toch zowiezo het haasje ?
Welke andere manier is er dan nog om alsnog ervoor te zorgen dat de gebruiker z'n werk niet kwijt is, en de data toch 'integer' blijft ?

[ Voor 48% gewijzigd door whoami op 13-11-2005 20:36 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
tijn schreef op zondag 13 november 2005 @ 18:51:
Bij databinding moet het ook gewoon lukken hoor. Alleen even niet vergeten om EndCurrenEdit() van de currencymanager aan te roepen.
Mja, het lukt mij nu idd ook om m'n object in een andere sessie te gaan saven, maar dan alleen op deze manier:
code:
1
2
3
4
ISession s = sessionFactoryObj.OpenSession();

s.SaveOrUpdate (_container);
...


Dus, zonder het gebruik van 'Lock' om het detached object aan de sessie te attachen.
Dit heeft dan wel weer de vervelende bijwerking dat er niet één update statement uitgevoerd wordt (voor m'n container), maar 3 update statments: één voor m'n container, en één voor ieder item in m'n container, en dat terwijl ik enkel de naam van m'n container gewijzgd heb, en niets aan de 'Items' gewijzigd heb.
Wat ik dus zou willen, is dat ik mbhv Lock oid m'n Container object (in z'n oude state) 'attach' aan de Sessie, en dan een SaveOrUpdate aanroep met het object in z'n nieuwe state, zodanig dat er enkel voor de daadwerkelijk gewijzigde records een update statement uitgevoerd wordt.
Dat lukt me dus wel als ik geen gebruik maak van databinding, maar NHibernate icm databinding werkt niet zoals ik het wil.
Echter, ik denk niet dat het mogelijk is, als ik dit zo lees:

To force a version check without a version or timestamp property mapping, with a comparison of the state of all fields in a row, turn on optimistic-lock="all" in the mapping. Note that this concepetually only works if Hibernate can compare the old and new state, i.e. if you use a single long Session and not session-per-request-with-detached-objects.

[ Voor 15% gewijzigd door whoami op 13-11-2005 21:11 ]

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

Ik denk dat je dan het beste het 'versioning' op een juiste manier moet gaan implementeren.
Pas dan zal Hibernate zien dat alleen je container is gewijzigd en de items die daarbij horen niet.

Neem je whisky mee, is het te weinig... *zucht*


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Hmm, en dat doe ik dan waarschijnlijk mbhv het version of timestamp element in m'n mapping file.
* whoami zal daar maar es eea over opzoeken en wat testen.

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

Ik ben daar ook wel benieuwd naar, want heb het zelf nog niet nodig gehad, aangezien ik Hibernate meerendeels heb gebruik voor kleinschalige web-apps waar de user zelf vrijwel niets kan updaten.

Wat er kan worden aangepast, kan door maar 1 user worden gedaan en dat is met gewone applicatie rechten afgeschermd.

Voor de toekomst (ook voor die web-app) is het wel interessant om te weten hoe deze problematiek aan te pakken is, want dan zal er wel meer updating plaats gaan vinden door users. :)

Neem je whisky mee, is het te weinig... *zucht*


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Daarvoor gebruiken we dan ook een ObjectView :) (al moet ik er wel bij zeggen de huidige versie wat gammel is wegens werk aan het design-time gebeuren).

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Ik krijg het toch niet voor elkaar als ik databinding gebruik, om het spul te laten werken zoals ik dat wil.

Als ik bij het ophalven van m'n container m'n sessie sluit, en bij het saven een nieuwe sessie open, dan worden ook de dingen die niet aangepast z'n gewijzigd, omdat het saven dus in een andere sessie gebeurd, en de oorspronkelijke staat van m'n object niet gekend is in die sessie.

Als ik, nadat ik m'n sessie geopend heb bij het saven, m'n object toewijs aan m'n sessie (mbhv Lock, dan wordt er niets geupdated, omdat m'n sessie dan vind dat m'n object niet gewijzigd is (hij krijgt m'n object daar al in de state zoals die gewijzigd is (navl databinding)).
Als er dan dus een Update aangeroepen wordt, vind hibernate dat er niets gewijzigd is, dus wordt er ook niets geupdated.

Ik geloof dus, dat ik in dit geval enkel met een 'long running session' (of hoe heet het ook alweer) kan werken.

(Oja, ik maak ook gebruik van custom versioning).

https://fgheysels.github.io/


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Er is ook nog iets als SaveOrUpdateCopy(). Ik meende ooit eens ergens gelezen te hebben dat dat geschikt was voor objecten die gedetacht waren, maar helemaal zeker weten doe ik het niet.

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
SaveOrUpdateCopy is deprecated volgens de Hibernate docs.
'Use merge instead'.
Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped with cascade="merge".
Hmm.... zal ik eens moeten bekijken.

Dit zorgt er natuurlijk wel voor dat ik in m'n client-code (UI), eigenlijk met die sessions etc moet spelen; dat kan ik niet aan repositories oid over laten.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
POCO is idd een no-go.

Allereerst zit je met het probleem met bv databinding. Dit kan je oplossen door gebruik te maken van een UI - mapper, maar, dan vraag ik mij af: waar ben je mee bezig ? Nog een extra laag, gewoom om je BL poco te houden ?

Nu loop ik ook tegen het volgende: ik wil in m'n DB bijhouden wanneer en door wie een record het laatst veranderd werd. Hoe doe ik dat ?
Als ik het 'ugly' wil doen, zou ik ervoor kunnen zorgen dat ik een DateTime gebruik voor 'versioning'. Echter, dat is niet echt aan te raden, aangezien het kan dat er 2 gebruikers - in theorie - hetzelfde record op hetzelfde moment (milliseconde) wijzigen. Daar gebruik ik dus liever een GUID voor.
Ik wil dus bv: een guid voor versioning, een datetime die aangeeft wanneer m'n record het laatst gewijzigd werd, en een string waarin ik de username terugvind van diegene die het laatst het record gewijzigd heeft.
Hoe kan ik dat in NHibernate doen ? Ik zie er niet direct een mogelijkheid voor....
Ik kan deze waardes niet zomaar in m'n object zetten, want, wie zegt of m'n object wel daadwerkelijk gewijzigd is ?
MIsschien is er wel een member-method van het session object waarmee ik kan uitvogelen of m'n object dirty is of niet (ik weet het niet, ik zou het eens moeten bekijken), maar, dan moet ik dat hoogstwaarschijnlijk ook weer in m'n client-code gaan checken, en niet in m'n repository.

POCO is mooi in theorie, maar in praktijk...

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
NHibernate heeft toch wel zoiets dat je op het allerlaatst dingen kunt wijzigen / uitvoeren wanneer een entity wordt gesaved, bv een event oid?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
EfBe schreef op woensdag 16 november 2005 @ 09:23:
NHibernate heeft toch wel zoiets dat je op het allerlaatst dingen kunt wijzigen / uitvoeren wanneer een entity wordt gesaved, bv een event oid?
Ah, daar had ik nog niet aan gedacht. Misschien wel idd... Ik zal het eens opzoeken.

Ik ben eigenlijk nog niet zo lang met nhibernate bezig, en het is dan ook nog in m'n vrije tijd dat ik er zo nu en dan eens mee 'speel'.

https://fgheysels.github.io/


  • momania
  • Registratie: Mei 2000
  • Laatst online: 16:10

momania

iPhone 30! Bam!

whoami schreef op woensdag 16 november 2005 @ 09:28:
[...]


Ah, daar had ik nog niet aan gedacht. Misschien wel idd... Ik zal het eens opzoeken.
http://www.hibernate.org/...rence/en/html/events.html :Y)

Neem je whisky mee, is het te weinig... *zucht*


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
whoami schreef op woensdag 16 november 2005 @ 09:08:
[...]


POCO is idd een no-go.

Allereerst zit je met het probleem met bv databinding. Dit kan je oplossen door gebruik te maken van een UI - mapper, maar, dan vraag ik mij af: waar ben je mee bezig ? Nog een extra laag, gewoom om je BL poco te houden ?
Zuiver POCO is niet mijn ultieme doel, maar in het geval van databinding vind ik het strontvervelend om alle interfaces te moeten implementeren. Dit kun je alleen met code-generatie fatsoenlijk oplossen.
Een ObjectView of UI mapper of hoe je het ook noemt, zorgt er voor dat je ook makkelijk kunt databinden in non-code-generatie omgevingen.
Als ik het 'ugly' wil doen, zou ik ervoor kunnen zorgen dat ik een DateTime gebruik voor 'versioning'. Echter, dat is niet echt aan te raden, aangezien het kan dat er 2 gebruikers - in theorie - hetzelfde record op hetzelfde moment (milliseconde) wijzigen. Daar gebruik ik dus liever een GUID voor.
Ik wil dus bv: een guid voor versioning, een datetime die aangeeft wanneer m'n record het laatst gewijzigd werd, en een string waarin ik de username terugvind van diegene die het laatst het record gewijzigd heeft

Hoe kan ik dat in NHibernate doen ? Ik zie er niet direct een mogelijkheid voor....
Zul je zelf moeten programmeren. Elk bedrijf/persoon hanteert vaak eigen standaarden op dit gebied. Van een O/R mapper kun je gewoon niet verwachten dat alle scenario's zo maar ondersteund worden. Welke username zou er bijvoorbeeld opgeslagen moeten worden? De database user? De windows user? De user die in de applicatie is ingelogd?

Cuyahoga .NET website framework


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:06
Zul je zelf moeten programmeren. Elk bedrijf/persoon hanteert vaak eigen standaarden op dit gebied. Van een O/R mapper kun je gewoon niet verwachten dat alle scenario's zo maar ondersteund worden. Welke username zou er bijvoorbeeld opgeslagen moeten worden? De database user? De windows user? De user die in de applicatie is ingelogd?
Ik verwacht ook niet dat nhibernate dit voor mij gaat doen. Ik dacht gewoon -toen had ik nog niet aan events gedacht- dat ik die username zelf in m'n object ging moeten stoppen, echter, dat ging er wel voor zorgen dat m'n object zowiezo altijd dirty zou zijn, ook als de gebruiker zelf eigenlijk niets veranderd had.

https://fgheysels.github.io/

Pagina: 1