Hoi,
Ik ben vandaag begonnen om met wat het Entity Framework 4 te spelen (in combinatie met SQL Server Compact Edition 4 op een ASP.NET website), en hoewel alles prima werkt probeer ik nu een extra laagje abstractie in te bouwen.
In de websites die ik maak zorg ik er altijd voor dat alle tabellen in de database de volgende vier kolommen hebben:
Als ik in het Entity Framework nu een tabel toevoeg, zeg Persons, dan wordt er een Person class gegenereerd met de properties van deze tabel (dus inclusief Id, Deleted, CreatedTime, UpdatedTime). Deze gegenereerde class inherit EntityObject.
Om een extra laagje abstractie in te bouwen zou ik graag hebben dat deze vier standaard property in een extra class 'EntityBase' oid (of gewoon Entity) komen, die van EntityObject overerft. In plaats van de relatie EntityObject <--- Person, wil ik dus graag EntityObject <-- Entity <-- Person, waarbij Person nu de Id, Deleted, etc properties overerft van Entity in plaats van ze zelf te definieren.
Hoe kan ik het entity framework nu vertellen dat ik graag een extra basis class gebruik tussen EntityObject en Person in?
Voor meer informatie (die niet strikt nodig is om mijn vraag te beantwoorden denk ik):
Ik heb nu generic EditPage en ViewPage classes gemaakt die overerven van System.Web.UI.Page. De EditPage pagina stelt een pagina voor waar een record (entity) gewijzigd ofwel aangemaakt wordt (stel maar even voor een pagina met een paar textboxjes om wat details op te geven en een OK/Cancel knop). De ViewPage pagina stelt een pagina voor met een grid die de records laat zien, en een knopje om een nieuw record toe te voegen, te wijzigen, of te verwijderen.
Deze classes zijn generic en hebben als type parameters onder andere het type entity dat ermee gewijzigd / bekeken wordt:
Bijvoorbeeld, stel dat ik een ViewPage heb die personen laat zien (en de EditPage dus de details van een persoon, naam, telefoon, adres, etc), dan heeft deze als type parameter Person, waarbij Person de class is die ik van het Entity Framework model krijg (automatisch gegenereerd onder het edmx bestand).
Hoewel ik hier al vrij veel mee kan zoek ik toch nog een abstractie hoger: ik wil graag dat deze Person class overerft van mijn eigen 'Entity' class. In deze Entity class heb ik simpelweg de vier properties die ik hierboven genoemd heb (Id, Deleted, CreateTime, UpdatedTime) gedefinieerd.
Het voordeel hiervan is dat ik het merendeel van de New/Edit/Delete functies in de abstracte EditPage/ViewPage kan plaatsen zodat ik die code niet meer zelf hoef te schrijven. Het is toch steeds dezelfde code, enkel met een andere entity. Op het moment kan dit niet omdat de IDE niet "weet" dat elke entity die ik maak deze properties zal hebben (enkel dat het een EntityObject is). Wellicht dat ik Reflection zou kunnen gebruiken en er gewoon vanuit ga dat TEntity deze properties heeft, maar datis natuurlijk niet zo netjes.
Het probleem is nu dat ik de Person class van het entity framework krijg, en deze inherit EntityObject, dus moet mijn type parameter TEntity overerven van EntityObject, en die class heeft geen Id, Deleted, etc properties.
Hoe kan ik nu zorgen dat het Entity Framework als basis mijn Entity class gebruikt? Mijn Entity class zou dan uiteraard op zijn beurt van EntityObject kunnen overerven (anders werkt het natuurlijk niet meer).
Is dit uberhaupt mogelijk?
Bedankt!
Ik ben vandaag begonnen om met wat het Entity Framework 4 te spelen (in combinatie met SQL Server Compact Edition 4 op een ASP.NET website), en hoewel alles prima werkt probeer ik nu een extra laagje abstractie in te bouwen.
In de websites die ik maak zorg ik er altijd voor dat alle tabellen in de database de volgende vier kolommen hebben:
- Id (autonummer ofwel identity)
- Deleted (bit/boolean die aangeeft of het record verwijderd is)
- CreatedTime (datetime)
- UpdatedTime (datetime)
Als ik in het Entity Framework nu een tabel toevoeg, zeg Persons, dan wordt er een Person class gegenereerd met de properties van deze tabel (dus inclusief Id, Deleted, CreatedTime, UpdatedTime). Deze gegenereerde class inherit EntityObject.
Om een extra laagje abstractie in te bouwen zou ik graag hebben dat deze vier standaard property in een extra class 'EntityBase' oid (of gewoon Entity) komen, die van EntityObject overerft. In plaats van de relatie EntityObject <--- Person, wil ik dus graag EntityObject <-- Entity <-- Person, waarbij Person nu de Id, Deleted, etc properties overerft van Entity in plaats van ze zelf te definieren.
Hoe kan ik het entity framework nu vertellen dat ik graag een extra basis class gebruik tussen EntityObject en Person in?
Voor meer informatie (die niet strikt nodig is om mijn vraag te beantwoorden denk ik):
Ik heb nu generic EditPage en ViewPage classes gemaakt die overerven van System.Web.UI.Page. De EditPage pagina stelt een pagina voor waar een record (entity) gewijzigd ofwel aangemaakt wordt (stel maar even voor een pagina met een paar textboxjes om wat details op te geven en een OK/Cancel knop). De ViewPage pagina stelt een pagina voor met een grid die de records laat zien, en een knopje om een nieuw record toe te voegen, te wijzigen, of te verwijderen.
Deze classes zijn generic en hebben als type parameters onder andere het type entity dat ermee gewijzigd / bekeken wordt:
C#:
1
2
3
| public class EditPage<TEntity, ...> : System.Web.UI.Page where TEntity : EntityObject where ... |
Bijvoorbeeld, stel dat ik een ViewPage heb die personen laat zien (en de EditPage dus de details van een persoon, naam, telefoon, adres, etc), dan heeft deze als type parameter Person, waarbij Person de class is die ik van het Entity Framework model krijg (automatisch gegenereerd onder het edmx bestand).
Hoewel ik hier al vrij veel mee kan zoek ik toch nog een abstractie hoger: ik wil graag dat deze Person class overerft van mijn eigen 'Entity' class. In deze Entity class heb ik simpelweg de vier properties die ik hierboven genoemd heb (Id, Deleted, CreateTime, UpdatedTime) gedefinieerd.
Het voordeel hiervan is dat ik het merendeel van de New/Edit/Delete functies in de abstracte EditPage/ViewPage kan plaatsen zodat ik die code niet meer zelf hoef te schrijven. Het is toch steeds dezelfde code, enkel met een andere entity. Op het moment kan dit niet omdat de IDE niet "weet" dat elke entity die ik maak deze properties zal hebben (enkel dat het een EntityObject is). Wellicht dat ik Reflection zou kunnen gebruiken en er gewoon vanuit ga dat TEntity deze properties heeft, maar datis natuurlijk niet zo netjes.
Het probleem is nu dat ik de Person class van het entity framework krijg, en deze inherit EntityObject, dus moet mijn type parameter TEntity overerven van EntityObject, en die class heeft geen Id, Deleted, etc properties.
Hoe kan ik nu zorgen dat het Entity Framework als basis mijn Entity class gebruikt? Mijn Entity class zou dan uiteraard op zijn beurt van EntityObject kunnen overerven (anders werkt het natuurlijk niet meer).
Is dit uberhaupt mogelijk?
Bedankt!
[ Voor 20% gewijzigd door NickThissen op 10-01-2011 19:15 ]