Object-relational Mapping en ASP.NET
In dit labo ontwikkelen we een webapplicatie waarvan de datalaag gerealiseerd wordt met NHibernate.
In de theorie is er getoond hoe je een via xml-bestanden de mapping kunt definiëren tussen databanktabellen en de code-objecten.
In het labo gaan we echter nog een stap verder:
- In plaats van aparte xml-bestanden kun je de mapping ook definiëren via attributen (analoog aan annotaties in Java).
Enkele nuttige links i.v.m. NHibernate (met attributen):
Datalaag
De interface van de datalaag is reeds vastgelegd en vind je in het bestand BadmintonInterface.zip. Deze interfaces maken deel uit van de DLL BadmintonInterface.dll.
Maak een implementatie voor deze interfaces gebruik makend van NHibernate. Maak een apart Visual Studio Project voor je datalaag BadmintonImplementatie.
Interface
De datalaag stelt een aantal sportclubs met bijhorende leden en tornooien voor. Leden kunnen spelende leden of niet-spelende leden.
Databank
Uiteraard hebben we voor ORM een databank nodig. Hiervoor gebruiken we SQL Server Express, een afgeslankte gratis versie van SQL-versie, die goed in Visual Studio geïntegreerd is.
Ga als volgt te werk: In het Server Explorer-venster klik je rechts op Data Connections, kies Add Connection, klik op Browse, selecteer de gewenste map en kies een naam (extensie .mdf).
Het is aan te raden de databank in een map App_Data in het project op te slaan.
Eens de databank gemaakt kun je die testen in het Server Explorer venster.
Zoals gezegd kan NHibernate het databankschema zelf genereren - je hoeft dus geen tabellen te maken.
(N)Hibernate genereert zelf het databankschema aan de hand van de gegeven mapping (hetzij via xml hetzij via attributen). Je moet de databank wel aanmaken, maar de tabellen zelf niet!
Libraries
Download de nodige dll's en bewaar ze in een map Lib in het project. De zip-file bevat dll's voor NHibernate 1.2.0, voor log4net en voor het aparte pakket NHibernate mapping attributes.
Voeg in het project referenties toe aan deze dll's.
Configuratie
Om NHibernate te kunnen gebruiken moet je eerste de nodige configuraties doen.
Dit kan dynamisch, in de code, maar ook via een configuratiebestand, zoals App.config (Add New Item - Application Configuration File).
Er zijn verschillende manieren om de configuratie te bepalen.
Een voorbeeld vind je hier.
In de code moet je de configuratie openen bij het begin van de applicatie:
Configuration cfg = new Configuration();
cfg.AddAssembly(naam-van-de-assembly);
cfg.Configure();
Om de NHibernate Mapping attributen te gebruiken kan je de volgende code gebruiken:
HbmSerializer.Default.Validate = true; // validatie (optioneel)
cfg.AddInputStream(HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetExecutingAssembly()));
Documentatie over de mapping-attributen is niet zo makkelijk te vinden. Je kunt je baseren op voorbeelden,
maar ook op documentatie over NHibernate zonder atttributen.
De attributen zijn immers analoog aan de elementen die je aantreft in een xml mapping-bestand.
Opgelet: sommige xml-elementen moet je als attribuut-parameter meegeven, andere via een extra attribuut!
Omdat de correcte volgorde van attributen af te dwingen (standaard zijn ze niet geordend),
moet je een volgnummer als eerste argument van een attribuut geven:
[Foo(...)] OFWEL [FOO(0, ...)]
[Bar(1, ...)]
class / Property ...
Console-applicatie
In eerste instantie maken we een eenvoudige C# console-applicatie in Visual Studio,
met de naam NHibernateTest. Deze console-applicatie heeft de volgende functionaliteit
Opmerking
Naarmate de applicatie groeit, zul je de functionaliteit opsplitsen in verschillende klassen en methoden.
Per "transactie" kun je best een nieuwe ISession openen.
De sessionFactory mag echter slechts één keer gecreëerd worden.
Maak een singleton-klasse ORMHelper die de configuratie verzorgt en een singleton-instantie van SessionFactory
bijhoudt. Voorzie een methode OpenSession om een sessie te openen.
Je applicatie moet ervoor zorgen dat sessies steeds keurig afgesloten worden. Dit kan bv. via het using-mechanisme,
dat Dispose (en Close) oproept bij het verlaten van het blok:
using(ISession session = ORMapper.OpenSession())
{
// data ophalen...
}
Indien je data wijzigt of toevoegt is het aan te raden met transacties te werken. Illustratie:
ISession session = null;
ITransaction transaction = null;
try
{
session = sessionFactory.OpenSession();
transaction = session.BeginTransaction();
// data ophalen/creeren/wijzigen/wegschrijven...
transaction.Commit();
}
catch
{
if(transaction != null)
transaction.Rollback();
throw;
}
finally
{
if(session != null)
session.Close();
}
Webapplicatie
Maak een webapplicatie in ASP.NET waarin je de gemaakte datalaag gebruikt: de applicatie bevat een overzicht van alle clubs en een overzicht van alle tornooien. Als je op een club klikt dan krijg je zijn leden te zien.
Extra
Maak een afgeschermde pagina om leden toe te voegen of te verwijderen en één om tornooien te beheren: spelers toevoegen of verwijderen.
|