Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[.NET EF] Entity Framework, Code First, bestaande databases

Pagina: 1
Acties:

  • Lethalis
  • Registratie: April 2002
  • Niet online
Omdat ik vind dat we op kantoor toch eens moeten beginnen met het gebruik van ORM, heb ik weer eens een poging gedaan om het .NET Entity Framework te gebruiken (versie 6, maar wel op .NET 4.0 ipv 4.5).

Het voornaamste probleem waar ik tegen aanloop, is de bestaande structuur en manier van werken. Kortom: ik moet het EF zo gebruiken dat het past in onze werkwijze, in plaats van onze werkwijze aanpassen aan EF.

Simpel gezegd:
- We maken altijd eerst een database, en daarna onze code. Database first dus.
- We werken met bestaande databases, die vaak 30 GB groot zijn en een paar honderd tabellen bevatten.

Mijn eerste probleem is "database first". Dat werkt niet lekker met het feit dat we zomaar 200 tabellen kunnen hebben in een database. Een oplossing die vaak wordt geopperd op internet, is dat je dan maar een model per module moet maken. Bijvoorbeeld een model voor de boekhouding, een model voor de order module, een model voor klantonderhoud, etc.

Een groot nadeel dat ik daarvan zie, is dat deze modellen met elkaar zullen overlappen. De boekhouding verwijst immers naar klanten, maar de ondermodule ook. Tevens werkt zo'n designer niet lekker met veel tabellen.

Dit heeft mij gedreven om naar "code first" te kijken. Een oplossing die ik heb bedacht, is om entities te hergebruiken in meerdere contexten.

Dus bijvoorbeeld dat zowel in een BoekhoudContext als een OrderContext, een DbSet met Klant voorkomt. Op die manier heb ik nog maar 1 definitie van Klant. Ook heeft "code first" het voordeel dat ik gewoon lekker POCO classes heb met wat definities en / of annotations. Het is vrij clean en daar hou ik van.

Daar staat tegenover, dat "code first" zelf rommelt met de database. Het gebruikt database initializer's, het pluralise't van alles. Veel tabellen die in onze bestaande databases bestaan, zijn in enkelvoud genaamd. Een klant is een klant, en niet klanten of nog erger klants ;)

Dingen die ik tot nu toe gedaan heb, zijn dus:
- Entities gebruiken in meerdere DbContext classes
- Pluralization uitzetten (code: modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)())

Waar ik nu heel benieuwd naar ben, is:

1. Zien jullie nadelen van het gebruiken van entity classes in meerdere DbContext classes?
Dus dat zowel een BoekhoudContext als een OrderContext class een DbSet van Klant zou kunnen hebben:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Public Class BoekhoudContext
  Inherits DbContext

  Public Overridable Property Boekregel() As DbSet(Of Boekregel)
  Public Overridable Property Klant() As DbSet(Of Klant)

  Public Sub New(connectionString As String)
    MyBase.New(connectionString)
  End Sub

  Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    MyBase.OnModelCreating(modelBuilder)

    modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
    modelBuilder.Configurations.Add(New BoekregelMap())
    modelBuilder.Configurations.Add(New KlantMap())

  End Sub

End Class


Maar ook:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Public Class OrderContext
  Inherits DbContext

  Public Overridable Property Orderregel() As DbSet(Of Orderregel)
  Public Overridable Property Klant() As DbSet(Of Klant)

  Public Sub New(connectionString As String)
    MyBase.New(connectionString)
  End Sub

  Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    MyBase.OnModelCreating(modelBuilder)

    modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
    modelBuilder.Configurations.Add(New OrderregelMap())
    modelBuilder.Configurations.Add(New KlantMap())

  End Sub

End Class


2. Hoe werken jullie eigenlijk met het Entity Framework?
Ik heb tot nu toe niet echt het idee dat ik er tijd mee bespaar namelijk, omdat ik tegen heel wat hobbels aanloop met "code first". Het lijkt erg handig voor nieuwe kleine projecten, maar vrij onhandig in combinatie met grote bestaande projecten (waar ik 90% van de tijd in werk helaas).

En ik blijf iemand die een enorme voorkeur heeft voor code. Ik hou niet van designers, want mijn ervaring daarmee is - dat hoewel ze lekker snel tot een resultaat kunnen leiden - ze ook vaak een puinhoop kunnen maken van een bestaande situatie (even buiten beschouwing gelaten dat ze ook weleens Visual Studio laten crashen).

PS:
Don't mind the VB.NET code.. dat is verplicht op kantoor hier, omdat ik collega's heb die van VB6 naar VB.NET gegaan zijn. Ik heb ook 4 jaar met C# gewerkt, maar mijn collega programmeurs dus niet.

Ask yourself if you are happy and then you cease to be.


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 18:52

Sebazzz

3dp

Op mijn werk heb ik voor een nieuw project Entity Framework ingezet, geopperd als alternatief voor NHibernate wat wij voor de rest van de projecten gebruiken.

Wat ik erg merk is dat ik in het begin van het project moeite heb om niet expliciet te zijn: met entity framework wordt veel automatisch geconfigureerd, terwijl je met Fluent NHibernate redelijk expliciet moet zijn.

Entity Framework werkt prettig omdat je in principe van de database af blijft omdat je codemodel voorop staat. Het scheelt tijd omdat je eigenlijk in de volgorde 'code veranderen' - 'script genereren' - (evt. aanpassen - 'script laten toepassen' flow zit, in plaats van 'database veranderen' - 'migratiescript maken' - 'code updaten'. Ik heb het gevoel dat dit tijd scheelt.

Wel mag het duidelijk zijn met EF Code First geen hele geavanceerde (of triviale, denk aan een component met een relatie naar een andere entiteit) scenario's mogelijk zijn: hiervoor zal je toch een andere ORM moeten gebruiken. Ik kan niet zeggen of EF voor jouw app geschikt is maar ik weet zeker dat het voor de oudere (en uitgebreidere) software die we hier hebben dat niet is.

En VB.NET .. ik weet niet of uberhaupt een model mappen met lambdna expressions wel leuk is in zo'n taal :p

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • frG
  • Registratie: Augustus 2004
  • Laatst online: 20-11 20:03

frG

Wat wil je precies bereiken met meerdere contexten dan?

Is er echt iets mis met een edmx die je laat vullen vanuit je database?
Ja het duurt iets langer als er 200 tabellen in staan, maar erg is dat niet.
Met EF6 kan je er zelfs voor opperen (voor overzichtelijkheid) bepaalde entity's hun eigen diagram te geven.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je kunt ook dezelfde "core" tabellen in elke losse module terug laten komen. Laat gewoon alles wat relevant is voor een bepaalde module terugkomen in de edmx van die module. Als dat alle 200 is voor elke module heb je grotere problemen dan EF gebruiken. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Lethalis
  • Registratie: April 2002
  • Niet online
Sebazzz schreef op woensdag 26 februari 2014 @ 19:04:
Wel mag het duidelijk zijn met EF Code First geen hele geavanceerde (of triviale, denk aan een component met een relatie naar een andere entiteit) scenario's mogelijk zijn: hiervoor zal je toch een andere ORM moeten gebruiken. Ik kan niet zeggen of EF voor jouw app geschikt is maar ik weet zeker dat het voor de oudere (en uitgebreidere) software die we hier hebben dat niet is.
Wat gebruiken jullie voor die oudere projecten dan?
En VB.NET .. ik weet niet of uberhaupt een model mappen met lambdna expressions wel leuk is in zo'n taal :p
Tsja :D Dat vraag ik me soms ook af. Het gebrek aan voorbeelden vind ik nu vaak al irritant, omdat de focus ervan erg op C# ligt. En de EF Power Tools genereren alleen C# code :D
frG schreef op woensdag 26 februari 2014 @ 21:29:
[...]
Wat wil je precies bereiken met meerdere contexten dan?

Is er echt iets mis met een edmx die je laat vullen vanuit je database?
Ja het duurt iets langer als er 200 tabellen in staan, maar erg is dat niet.
Met EF6 kan je er zelfs voor opperen (voor overzichtelijkheid) bepaalde entity's hun eigen diagram te geven.
Het eerste dat is mij opkomt, is performance. We werken nu bijvoorbeeld aan een grote Windows applicatie en elke keer als die opnieuw wordt opgestart bij een klant, zou het vrij vervelend zijn als een enkele context 200 tabellen bevat en daardoor erg traag is met initialiseren.

En daarnaast vind ik het totaal niet overzichtelijk. De boel moet wel goed te onderhouden blijven. Dus in plaats van 1 grote edmx wil je liever kleine hapklare brokken hebben die je kunt onderhouden.

Je moet daarbij ook niet vergeten dat we met 4 man aan het project werken en het vrij vervelend zou zijn als we met z'n vieren elke keer in hetzelfde bestand moeten werken. Met een oude source control zoals SourceSafe (locking) is dat helemaal niet te doen, maar met moderne merge tools zoals git word je daar ook niet vrolijk van lijkt me.
Grijze Vos schreef op donderdag 27 februari 2014 @ 08:50:
Je kunt ook dezelfde "core" tabellen in elke losse module terug laten komen. Laat gewoon alles wat relevant is voor een bepaalde module terugkomen in de edmx van die module.
Maar krijg je dan niet elke keer bijvoorbeeld de Klant entiteit tig keer, in plaats van dat je hem 1 keer hebt?

Om het project onderhoudbaar te houden wil je functionaliteit overal maar 1 keer hebben. En niet dat ik voor elke context een aparte Klant class heb, want reken er maar op dat de Klant class wordt uitgebreid met extra functionaliteit.. weliswaar met een partial class, maar dan nog. Diezelfde Klant class wordt misschien ook wel via een webservice naar buiten gebracht, of voor nog 50 andere dingen gebruikt.. dus daar wil ik er maar 1 van hebben.

Je moet je voorstellen dat we aan een groot Windows project werken, dat verschillende koppelingen met de buitenwereld heeft. De business laag wordt dus zowel door de Windows applicatie als door web services gebruikt en dat wil je zo clean mogelijk houden.

Tot nu toe heb ik dat altijd zelf opgelost met een eigen data access en business laag, maar op een gegeven moment hoop je dat je dit net zo netjes met een ORM tool kunt oplossen. Een aantal jaar geleden heb ik eens nhibernate getest, maar dat faalde hard op performancegebied toen.. (al mijn queries zijn geoptimaliseerd en lopen in lijn met een SQL indexing strategie normaal gesproken en het verschil was simpelweg te groot toen.. ook het initialiseren van nhibernate was vrij traag).

Overigens vond ik het default versioning systeem van nhibernate wel beter. Ik werk liever met 1 version veld voor optimistic concurrency dan dat alle velden worden gecontroleerd, want dat is in principe altijd trager.

[ Voor 76% gewijzigd door Lethalis op 27-02-2014 09:22 ]

Ask yourself if you are happy and then you cease to be.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt ook betere tooling gebruiken voor bv EF. Mijn designer (LLBLGen Pro, zie sig) werkt prima met grote databases (1000 tabellen is geen probleem) en je kunt bv in de designer meerdere sub models maken op 1 database, mocht je dat willen.
Een aantal jaar geleden heb ik eens nhibernate getest, maar dat faalde hard op performancegebied toen.. (al mijn queries zijn geoptimaliseerd en lopen in lijn met een SQL indexing strategie normaal gesproken en het verschil was simpelweg te groot toen.. ook het initialiseren van nhibernate was vrij traag).
EF is net zo traag hoor :) http://weblogs.asp.net/fb...ss-frameworks-part-2.aspx

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


Verwijderd

De standaard designer van EF is uberhaubt crappy, voor zowel kleine of grote databases.

Daar zijn twee oplossingen voor;
1. De oplossing van EfBe
2. EF Code First development gebruiken in een Database First omgeving. Dat klinkt wat stom, maar bij code first staat niets je in de weg om als nog eerst de tabellen ed. aan te maken om vervolgens de code te schrijven en alles te mappen.

Beide lossen overigens ook de problemen op met multiple checkout en de EF designer, want dat is nog steeds een ramp. Waarom men de layout opmaak van EF nog steeds in dezelfde file als de mappings heft staan is mij een raadsel...

  • Lethalis
  • Registratie: April 2002
  • Niet online
EfBe schreef op donderdag 27 februari 2014 @ 09:27:
Je kunt ook betere tooling gebruiken voor bv EF. Mijn designer (LLBLGen Pro, zie sig) werkt prima met grote databases (1000 tabellen is geen probleem) en je kunt bv in de designer meerdere sub models maken op 1 database, mocht je dat willen.
LLBLGen moet ik nog steeds een keer bekijken. Probleem is alleen dat ik dan ook mijn werkgever moet overtuigen het te kopen, terwijl andere oplossingen (EF of NHibernate.. of zelfs een micro ORM als Dapper, PetaPOCO of wat dan ook) gratis te gebruiken zijn.

Overigens ben ik posts van jou al vaak tegen gekomen op diverse sites :P
Verwijderd schreef op donderdag 27 februari 2014 @ 09:52:
De standaard designer van EF is uberhaubt crappy, voor zowel kleine of grote databases.

Daar zijn twee oplossingen voor;
1. De oplossing van EfBe
2. EF Code First development gebruiken in een Database First omgeving. Dat klinkt wat stom, maar bij code first staat niets je in de weg om als nog eerst de tabellen ed. aan te maken om vervolgens de code te schrijven en alles te mappen.

Beide lossen overigens ook de problemen op met multiple checkout en de EF designer, want dat is nog steeds een ramp. Waarom men de layout opmaak van EF nog steeds in dezelfde file als de mappings heft staan is mij een raadsel...
Zoals je in mijn start post kunt zien, ben ik al begonnen met Code First development in een Database First omgeving :)

Ik vind het alleen wel wat eng dat Code First rommelt met de database. Zo had ik in het begin de pluralisation nog niet uitstaan en kreeg ik er gratis ineens allemaal nieuwe tabellen in mijn database bij (bijvoorbeeld Klants, OrderHeaders, OrderDetails.. terwijl ze eigenlijk Klant, OrderHeader, OrderDetail heten).

In hoeverre Code First voor de rest nog dingen wijzigt, moet ik uitzoeken. Ik hoop dat het beperkt blijft tot nieuwe dingen aanmaken die niet bestaan. Migrations wil ik iig niet gebruiken dus. Het punt blijft namelijk dat ik op bestaande databases aansluit en die mogen vaak ook niet zomaar gewijzigd worden qua schema. Het liefst zet ik die Database Initialiser helemaal uit :)

[edit]
Het is mij inmiddels gelukt om via een static constructor van mijn OrderContext de database intializer uit te zetten:

code:
1
2
3
4
5
6
  Shared Sub New()

    ' Deze static constructor wordt aangeroepen voordat er ueberhaupt een instance is
    Database.SetInitializer(Of OrderContext)(Nothing)

  End Sub


Weer een hobbeltje minder :)

[ Voor 66% gewijzigd door Lethalis op 27-02-2014 10:49 ]

Ask yourself if you are happy and then you cease to be.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Lethalis schreef op donderdag 27 februari 2014 @ 10:21:
[...]

LLBLGen moet ik nog steeds een keer bekijken. Probleem is alleen dat ik dan ook mijn werkgever moet overtuigen het te kopen, terwijl andere oplossingen (EF of NHibernate.. of zelfs een micro ORM als Dapper, PetaPOCO of wat dan ook) gratis te gebruiken zijn.
Het is inderdaad niet gratis, maar als je de tijd optelt die je nu bezig bent geweest en nog bezig zult zijn met dit probleem + in de toekomst de onderhoudbaarheid van je systeem (denk alleen maar aan het updaten van jouw code wanneer de database wijzigt), dan valt het denk ik allemaal reuze mee en is wat je nu doet waarschijnlijk minder efficient, maar goed, iedereen moet dat natuurlijk zelf bepalen :)
[...]
Zoals je in mijn start post kunt zien, ben ik al begonnen met Code First development in een Database First omgeving :)

Ik vind het alleen wel wat eng dat Code First rommelt met de database. Zo had ik in het begin de pluralisation nog niet uitstaan en kreeg ik er gratis ineens allemaal nieuwe tabellen in mijn database bij (bijvoorbeeld Klants, OrderHeaders, OrderDetails.. terwijl ze eigenlijk Klant, OrderHeader, OrderDetail heten).

In hoeverre Code First voor de rest nog dingen wijzigt, moet ik uitzoeken. Ik hoop dat het beperkt blijft tot nieuwe dingen aanmaken die niet bestaan. Migrations wil ik iig niet gebruiken dus. Het punt blijft namelijk dat ik op bestaande databases aansluit en die mogen vaak ook niet zomaar gewijzigd worden qua schema. Het liefst zet ik die Database Initialiser helemaal uit :)
Code first houdt data bij hoe het schema gewijzigt moet worden wanneer de code wijzigt, immers het gaat er vanuit dat je start met code en de database daaruit volgt. Jij begint met een database en daaruit volgt dan de code.

Code first met een bestaande database gebruiken kan wel (bv wanneer de classes overeenkomen met je model) maar hou er wel rekening mee dat wanneer de database wijzigt, jijzelf de code moet aanpassen. Nu is hier en daar een veldje erbij typen niet zo moeilijk, het wordt anders wanneer types wijzigen of relationship types wijzigen, bv van 1:1 naar 1:n of vice versa.

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


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
LLBLGen is zo gepriced dat je je moet afvragen of je je werkgever nog serieus moet nemen als ze die investering niet willen doen. EfBe heeft sowieso een gratis trial. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Grijze Vos schreef op donderdag 27 februari 2014 @ 14:43:
LLBLGen is zo gepriced dat je je moet afvragen of je je werkgever nog serieus moet nemen als ze die investering niet willen doen. EfBe heeft sowieso een gratis trial. ;)
299,- per seat is anders voor de meeste bedrijven een forse investering... Goed er zijn discounts maar dan nog.

Ik zeg overigens niet dat het duur is (Ik ben het ermee eens dat de price gewoon fair is voor wat je ervoor krijgt), maar jouw statement is wel slijmerigheid van de bovenste plank.

  • Lethalis
  • Registratie: April 2002
  • Niet online
EfBe schreef op donderdag 27 februari 2014 @ 14:18:
[...]

Het is inderdaad niet gratis, maar als je de tijd optelt die je nu bezig bent geweest en nog bezig zult zijn met dit probleem + in de toekomst de onderhoudbaarheid van je systeem (denk alleen maar aan het updaten van jouw code wanneer de database wijzigt), dan valt het denk ik allemaal reuze mee en is wat je nu doet waarschijnlijk minder efficient, maar goed, iedereen moet dat natuurlijk zelf bepalen :)
Dan ga je ervan uit dat het gebruik van LLBLGen geen leercurve heeft :P

Dat gaat ook tijd kosten, waarschijnlijk gewoon net zoveel tijd.

Wij gebruiken op kantoor controls van DevExpress. Hartstikke handige controls, maar je wil niet weten hoeveel tijd we kwijt zijn geweest aan het implementeren daarvan. En dan heb ik het nog niet eens over de problemen die we zijn tegenkomen door upgrades en bugs indienen / hotfixes installeren.
Code first met een bestaande database gebruiken kan wel (bv wanneer de classes overeenkomen met je model) maar hou er wel rekening mee dat wanneer de database wijzigt, jijzelf de code moet aanpassen. Nu is hier en daar een veldje erbij typen niet zo moeilijk, het wordt anders wanneer types wijzigen of relationship types wijzigen, bv van 1:1 naar 1:n of vice versa.
Dat klopt, maar dat geldt ook voor onze huidige code (eigen DAL met custom SQL). Misschien nog wel meer dan dat het voor EF geldt. Een veldje veranderen kan zomaar alles om zeep helpen :)

Sowieso ben ik bang dat het gebruiken van een ORM veel eigen tijdsinvestering gaat kosten. In mijn huidige project heb ik het nu al geannuleerd omdat ik gewoon veel te veel problemen tegenkom. Dus dat wordt thuis een testproject opbouwen en verschillende scenario's doortesten.

Mijn werkgever heeft er geen enkel belang bij, tenzij ik er echt productiever door word.. en dat is voorlopig niet zo. Ook al is het tool nog zo mooi, je zal het toch moeten leren gebruiken op een effectieve manier.

[ Voor 13% gewijzigd door Lethalis op 27-02-2014 16:13 ]

Ask yourself if you are happy and then you cease to be.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Lethalis schreef op donderdag 27 februari 2014 @ 16:07:
[...]
Dan ga je ervan uit dat het gebruik van LLBLGen geen leercurve heeft :P
Dat gaat ook tijd kosten, waarschijnlijk gewoon net zoveel tijd.
Als je EF als target ORM gebruikt, lijkt me dat niet. De code die gegenereerd wordt ligt dicht bij wat MS zelf genereert met hun designer, behalve dan dat het beter georganiseerd is (2 projects ipv 1 bv), en je veel meer in de code kunt genereren, bv attributes op basis van rules op fields. Tuurlijk is er een leercurve mbt wat de designer kan, maar veel wijst zich de weg vanzelf. Het is iig efficienter dan dat je eerst tijd kwijt bent met EF's eigen designer, en dan met code first probeert de EF code aan je database te koppelen. Na wat werk zal dat dan nog wel lukken, maar wanneer de database wijzigt begint voor veel projecten het echte tijdverlies pas.
Dat klopt, maar dat geldt ook voor onze huidige code (eigen DAL met custom SQL). Misschien nog wel meer dan dat het voor EF geldt. Een veldje veranderen kan zomaar alles om zeep helpen :)
Met tooling (welke dat dan ook is) zou dat niet voor moeten komen. Immers de tooling zorgt voor de sync tussen jouw model in code en jouw model in tables.
Sowieso ben ik bang dat het gebruiken van een ORM veel eigen tijdsinvestering gaat kosten. In mijn huidige project heb ik het nu al geannuleerd omdat ik gewoon veel te veel problemen tegenkom. Dus dat wordt thuis een testproject opbouwen en verschillende scenario's doortesten.
Het gebruik van een ORM kost tijd, net als het gebruik van een custom grid van DevExpress, maar je gaat aan het punt voorbij dat de data wel uit de database moet worden gehaald en nog belangrijker: weer naar de database toe moet. Dus daar moet wel code voor geschreven worden of op een andere manier gegenereerd worden. Daar kun je niet omheen, net als dat je een grid nodig hebt in je UI.
Mijn werkgever heeft er geen enkel belang bij, tenzij ik er echt productiever door word.. en dat is voorlopig niet zo. Ook al is het tool nog zo mooi, je zal het toch moeten leren gebruiken op een effectieve manier.
De reden dat je zelf geen UI controls maakt maar een 3rd party gebruikt zou dezelfde reden moeten zijn waarom het tijdverlies is dat je wel het probleem van efficiente data-access zelf gaat oplossen. Zelf data-access code schrijven is niet simpel. Tuurlijk, wat queries runnen en wat objectjes vullen, dat is de moeite niet. Een object graph in de juiste volgorde wegschrijven is dat wel. Het bouwen van een ORM kost jaren, dat zelf doen in veel kortere tijd (immers, het is plumbing, dus iedere minuut die je eraan besteedt is overhead) lukt niet. Er komt bij dat het specialistisch werk is, dus je bent gedoemd dezelfde fouten te maken die een ORM bouwer ook al gemaakt heeft (en heeft opgelost).

Verder is de zelfgeschreven ORM een dependency die je zelf moet onderhouden. Die tijd kun je ook aan user features besteden. Je hoeft mijn spullen niet te gebruiken, dat moet iedereen zelf uitmaken, maar wat ik je wel zou willen adviseren is dat het bouwen van eigen persistence frameworks niet echt efficient is, dus gebruik wat anderen al voor je hebben gecreeerd. Je werkgever ziet kennelijk niet in dat zelf frameworks maken pas deproductief is, en dat is jammer, maar goed daar kun jij niets aan veranderen. Succes iig ;)

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


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 18:52

Sebazzz

3dp

Lethalis schreef op donderdag 27 februari 2014 @ 08:59:
[...]
Wat gebruiken jullie voor die oudere projecten dan?
NHibernate. Daarmee kan je praktisch elk databasemodel wat je kan bedenken mappen volgens mij :D :P

Wat betreft concurrency, EF ondersteunt concurrency tokens. Geen idee hoe het werkt, voor de rest niet in verdiept.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • Lethalis
  • Registratie: April 2002
  • Niet online
Sebazzz schreef op vrijdag 28 februari 2014 @ 09:48:
[...]
NHibernate. Daarmee kan je praktisch elk databasemodel wat je kan bedenken mappen volgens mij :D :P
Zou ik hieruit de conclusie kunnen trekken dat nhibernate misschien handiger is om te gebruiken in combinatie met bestaande databases?

Wel heb ik verhalen gehoord dat de ontwikkeling van nhibernate veel trager gaat dan die van EF en dat ze .NET 4 nog niet helemaal ondersteunen?

De grap is dat we op kantoor eind vorig jaar eindelijk hebben besloten om al onze projecten naar .NET Framework 4 te upgraden en met Visual Studio 2012 (en nu ook 2013) te gaan werken, dus het is wel fijn om dan ook een moderne ORM tool te gebruiken.

Ask yourself if you are happy and then you cease to be.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op donderdag 27 februari 2014 @ 15:18:
[...]


299,- per seat is anders voor de meeste bedrijven een forse investering... Goed er zijn discounts maar dan nog.

Ik zeg overigens niet dat het duur is (Ik ben het ermee eens dat de price gewoon fair is voor wat je ervoor krijgt), maar jouw statement is wel slijmerigheid van de bovenste plank.
299 euro die je afschrijft over pak em beet 3 jaar. Dat is 100 euro per jaar, op een developer die pak em beet 30-100K kost per jaar. Nee, echt, dat is geen investering. Een zinnige bureaustoel is al duurder.

(Bovendien, als je een taakverdeling hebt binnen je bedrijf hoeft ook niet per se elke developer een licentie te hebben. En de pricing is per seat, dus je kunt - als ik het goed interpreteer - de licentie delen tussen part time developers.)

[ Voor 16% gewijzigd door Grijze Vos op 28-02-2014 10:41 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Lethalis
  • Registratie: April 2002
  • Niet online
EfBe schreef op vrijdag 28 februari 2014 @ 08:42:
[...]
Met tooling (welke dat dan ook is) zou dat niet voor moeten komen. Immers de tooling zorgt voor de sync tussen jouw model in code en jouw model in tables.
We werken nog steeds veelal met ouderwetse DataSet's en code generation.

Dus we hebben wel een tooltje dat classes genereert (vaak schilletje om DataRow's heen), maar daarna moet je aanpassingen zelf doorvoeren. Hoewel we wel een scheiding hebben aangehouden tussen gegenereerde code en eigen code met behulp van partial classes. Dus je kunt een class gewoon opnieuw genereren zonder veel issues.

Ik ben met je eens dat een volwassen ORM tool veel beter zou zijn om te gebruiken, plumbing code zonde van de tijd is, en dat is dan ook de reden waarom ik onderzoek naar ORM tools doe. En ik weet ook dat er TableAdapters zijn en strongly typed DataSet's, maar die skip ik liever.

Zoals met veel dingen op mijn werk, werken we van deadline naar deadline en is de neiging groot om bij elk project te blijven gebruiken wat je het beste kent.

Overigens heb ik een aantal jaar geleden een eigen simpele ORM tool gemaakt, en ik weet dus heel goed hoe het is om zo'n kreng te onderhouden (die doet overigens geen graph bijhouden met relaties, maar alleen 1 op 1 mappen tussen classes en tabellen). Ik wil er dan ook heel graag vanaf :D Maar de grote vraag blijft dan altijd waar je naartoe gaat.

Het Entity Framework leek mij een goede keuze omdat het inmiddels bij versie 6 is en Microsoft erachter staat. Dat betekent niet dat het per se de beste keuze is, maar wel een keuze die ik wat makkelijker kan verdedigen op kantoor onder het simpele motto "dit is wat Microsoft tegenwoordig aanraadt om te gebruiken". NHibernate aanraden is bijvoorbeeld al moeilijker.

We doen bijna uitsluitend .NET ontwikkeling op kantoor (met wat uitstapjes naar Objective C voor iPhone en iPad apps) en gebruiken als database backend altijd SQL Server.

DevExpress is bij ons alleen naar binnen gekomen, omdat het ook erg aan de voorkant staat van onze producten. Ze zien er meteen veel frisser door uit. Op het web ondersteunen ze meteen AJAX (wat tot een betere experience leidt) en op Windows forms theming, waardoor onze Windows applicaties ook een opfrisser krijgen.

Een ORM tool staat op de achtergrond. De klant ziet er niks van, mijn baas ziet er niks van. Het zal hem eigenlijk worst zijn hoe ik programmeer, als het maar werkt en op tijd af is. Het is dus vooral iets waarmee ik mezelf moet onderscheiden van de rest om het ook te kunnen verkopen.

Kortom, als ik investeer in het gebruik van een ORM en daar uiteindelijk heel handig in word, dan kan ik het ook aan mijn collega's introduceren en vraagbak dienen. Dat gaat verder dan alleen het kunnen gebruiken, maar ik zal het ook een structurele plek moeten geven in onze projecten.

Ik ben er ook heel voorzichtig in, want toen Linq2sql op de markt kwam dook ik er op en liet meteen een collega ermee werken. Daar heb ik nu nog steeds spijt van :) Zijn module was erg traag en uiteindelijk heb ik hem helemaal geoptimaliseerd door delen ervan er uit te slopen en te vervangen door stored procedures. En sindsdien gebruikt hij geen ORM meer.

Mijn mening is dan ook dat ORM vooral handig is voor CRUD operaties en dat je goed op moet letten waarvoor je het gebruikt. Het is niet een one tool fits all situatie en wil niet weer op mijn bek gaan ermee.

Misschien begrijp je nu iets beter waarom ik er niet mee moet aankomen, tenzij het in 1 keer helemaal goed is en niks kost ;)

Alle tijd die ik er in steek, zit hem ook vrijwel compleet in mijn eigen tijd. Ik ben er vandaag ook mee bezig, terwijl ik gewoon vrij ben en tijd die ik doordeweeks kwijt ben geraakt er aan haal ik in het weekend weer in.

Als het aan mijn baas ligt, ben ik alleen met onze producten bezig en niet met hoe dingen handiger zouden kunnen. Maandag moet ik weer wat laten zien, dus ik heb eigenlijk helemaal geen tijd om ueberhaupt te experimenteren. Maar ik doe het toch, omdat daar de lol voor mij inzit. Ik wil altijd nieuwe dingen leren :)

[ Voor 5% gewijzigd door Lethalis op 28-02-2014 11:17 ]

Ask yourself if you are happy and then you cease to be.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Lethalis schreef op vrijdag 28 februari 2014 @ 11:10:
[...]
We werken nog steeds veelal met ouderwetse DataSet's en code generation.

Dus we hebben wel een tooltje dat classes genereert (vaak schilletje om DataRow's heen), maar daarna moet je aanpassingen zelf doorvoeren. Hoewel we wel een scheiding hebben aangehouden tussen gegenereerde code en eigen code met behulp van partial classes. Dus je kunt een class gewoon opnieuw genereren zonder veel issues.
Ze zijn niet populair onder de 'hippe developers' maar ze doen wel gewoon wat ze moeten doen, begrijp nooit goed die aversie tegen datatables/sets bv wanneer readonly sets moeten worden opgehaald.
Zoals met veel dingen op mijn werk, werken we van deadline naar deadline en is de neiging groot om bij elk project te blijven gebruiken wat je het beste kent.
Hmm... lijkt me geen gezonde werksfeer.
Het Entity Framework leek mij een goede keuze omdat het inmiddels bij versie 6 is en Microsoft erachter staat. Dat betekent niet dat het per se de beste keuze is, maar wel een keuze die ik wat makkelijker kan verdedigen op kantoor onder het simpele motto "dit is wat Microsoft tegenwoordig aanraadt om te gebruiken". NHibernate aanraden is bijvoorbeeld al moeilijker.
Is een veelgehoord verhaal. Gaat helaas wel aan het punt voorbij dat microsoft nogal eens laks is met fixen van bugs of het leveren van support...
Een ORM tool staat op de achtergrond. De klant ziet er niks van, mijn baas ziet er niks van. Het zal hem eigenlijk worst zijn hoe ik programmeer, als het maar werkt en op tijd af is. Het is dus vooral iets waarmee ik mezelf moet onderscheiden van de rest om het ook te kunnen verkopen.
Het is een simpele rekensom: het deel wat je feitelijk 'outsourced' aan een 3rd party hoef je zelf niet meer te doen. Veel ontwikkelaars hebben last van Not Invented Here syndrome en denken dat omdat ze ontwikkelaar zijn het allemaal zelf wel kunnen. Maar iedere minuut die zo'n specialist besteedt aan zaken waar hij feitelijk geen verstand van heeft is er een teveel en levert alleen maar tijdverlies op. M.a.w.: beargumenteren dat het allemaal maar zelf te doen beter is lijkt me vrij lastig want er zijn geen houtsnijdende argumenten voor.
Kortom, als ik investeer in het gebruik van een ORM en daar uiteindelijk heel handig in word, dan kan ik het ook aan mijn collega's introduceren en vraagbak dienen. Dat gaat verder dan alleen het kunnen gebruiken, maar ik zal het ook een structurele plek moeten geven in onze projecten.
hmm... zeker geen gezonde werksfeer. Er is toch wel iets van leiding bij jullie projecten? Of doet iedereen maar wat, en hoe dat gebeurt is aan de developer zelf?
Ik ben er ook heel voorzichtig in, want toen Linq2sql op de markt kwam dook ik er op en liet meteen een collega ermee werken. Daar heb ik nu nog steeds spijt van :) Zijn module was erg traag en uiteindelijk heb ik hem helemaal geoptimaliseerd door delen ervan er uit te slopen en te vervangen door stored procedures. En sindsdien gebruikt hij geen ORM meer.
Hoe krijg je het voor elkaar om linq to sql traag te krijgen? :) Lazy loading all over the place?
Mijn mening is dan ook dat ORM vooral handig is voor CRUD operaties en dat je goed op moet letten waarvoor je het gebruikt. Het is niet een one tool fits all situatie en wil niet weer op mijn bek gaan ermee.
ORMs zijn object materializers en persisters, maar hebben veel meer functionaliteit. Die noemen we 'entity services', bv logging, auditing, authorization, caching, validation, tuning van queries, noem het maar. het gaat veel verder dan crud. Bv ik kan een authorizer schrijven die ik inject met dependency injection (built-in) in iedere entity en die verifieert automatisch of de user van de huidige thread iets mag, bv een CC veld lezen of entities laden van een bepaald type. Set and forget, werkt altijd.

Ik noem jouw werkplek niet gezond omdat de leiding van het project waar je aan werkt te kortzichtig is om dit uberhaupt door te hebben. Verder is het IMHO niet echt gezond als een werknemer iets gangbaars wil voorstellen en dan uberhaupt bang is om af te gaan. Er is niet zoiets als afgaan in een situatie waar de leiding al niet snapt dat wanneer je een complex subsysteem aan een ander uitbesteedt die daar jaren aan gewerkt heeft het wellicht stukken efficienter is dan het wiel opnieuw uitvinden. ;)
Misschien begrijp je nu iets beter waarom ik er niet mee moet aankomen, tenzij het in 1 keer helemaal goed is en niks kost ;)
Ja dat begrijp ik heel goed, en een soortgelijke situatie als waar jij inzit was een van de redenen om 17 jaar geleden voor mezelf te beginnen :)
Alle tijd die ik er in steek, zit hem ook vrijwel compleet in mijn eigen tijd. Ik ben er vandaag ook mee bezig, terwijl ik gewoon vrij ben en tijd die ik doordeweeks kwijt ben geraakt er aan haal ik in het weekend weer in.
Je bent gek. Serieus. In de huidige markt zijn er legio developer jobs bij bedrijven die wel waarderen dat hun werknemers niet zo dom zijn als zijzelf. Het is jouw carriere natuurlijk.
Als het aan mijn baas ligt, ben ik alleen met onze producten bezig en niet met hoe dingen handiger zouden kunnen. Maandag moet ik weer wat laten zien, dus ik heb eigenlijk helemaal geen tijd om ueberhaupt te experimenteren. Maar ik doe het toch, omdat daar de lol voor mij inzit. Ik wil altijd nieuwe dingen leren :)
Je kunt overal nieuwe dingen leren. Het gaat ook niet over 'handiger', het gaat over efficienter. En dat je dat uberhaupt in je eigen tijd moet doen anders gebeurt er uberhaupt niks... Niet gezond. Life's too short, Lethalis!

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


  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 00:44
Beetje vreemd dat je als bedrijf geen ORM mapper oid gebruikt. Al gebruik je de meest basale vorm. Dat gehele crud mechanisme wil je toch niet handmatig kloppen?

Jaren terug kwam ik ook bij een klein bedrijfje terecht die dat niet had. Alles handmatig kloppen. Toen LLBL Gen Pro geïntroduceerd. Middagje puzzelen wat de beste generatie methode voor hun was, daarna custom DAL vervangen met die van de ORM mapper.
Bij een andere klant wilde ik dat ook introduceren. Dit in de overleg gegooid, een van de developers had een eigen ORM mapper gebouwd. Ook goed, deze aangepast en gaan met de banaan.
Ik moet er niet aan denken om alles handmatig te kloppen.

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 18:52

Sebazzz

3dp

Lethalis schreef op vrijdag 28 februari 2014 @ 10:40:
[...]

Zou ik hieruit de conclusie kunnen trekken dat nhibernate misschien handiger is om te gebruiken in combinatie met bestaande databases?
Ligt eraan hoe je database in elkaar zit. EF heeft zijn limitaties met hoe zaken gemapped kunnen worden. Dat zal je moeten onderzoeken.
Wel heb ik verhalen gehoord dat de ontwikkeling van nhibernate veel trager gaat dan die van EF en dat ze .NET 4 nog niet helemaal ondersteunen?
Er is geen officiele .NET 4 release nog, dat zal NHibernate 4 moeten worden. Maar NHibernate werkt wel op .NET 4.

NHibernate's ontwikkeling is inderdaad niet meer op de snelheid waarop het was, maar veel weet ik er niet vanaf. Valt genoeg op Google over te vinden :)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • Lethalis
  • Registratie: April 2002
  • Niet online
EfBe schreef op vrijdag 28 februari 2014 @ 12:22:
[...]
Ze zijn niet populair onder de 'hippe developers' maar ze doen wel gewoon wat ze moeten doen, begrijp nooit goed die aversie tegen datatables/sets bv wanneer readonly sets moeten worden opgehaald.
Ze werken prima inderdaad :) Maar wij gebruiken ze dus voor zo ongeveer alle data toegang. Ook het updaten van de database.
Hmm... lijkt me geen gezonde werksfeer.
In hoeverre dat daadwerkelijk zo is, is de vraag. Elke werkgever heeft zo zijn voor- en nadelen.

De recessie heeft natuurlijk ook zo zijn invloed op de werksituatie. We moeten dit jaar met een nieuwe versie van een bepaald pakket komen om concurrerend in de markt te blijven. Dan heb je niet veel keus behalve doorwerken.

Dat kan ik mijn werkgever niet kwalijk nemen. In hoeverre dit speelt bij andere werkgevers momenteel durf ik niet te zeggen :P

Voordelen die ik heb momenteel zijn: 36 urige werkweek, goede beloning incl. 13e maand en bonus, als ik een dag vrij wil dan is dat nooit een probleem, we gaan met z'n allen met lunchtijd meestal wandelen.. het is eigenlijk een soort hobbyclub, waarvan de sfeer normaal gesproken vrij gemoedelijk is.

Alleen hebben we meer concurrentie gekregen en dan wordt er wat meer gepusht van boven. Het zij zo.

Nadelen zijn: het verplicht moeten werken met VB.NET (argh :D ) en weinig doorgroeimogelijkheden (zit nog wel rek in salaris, maar niet in functie.. het is een platte organisatie).

Al met al vind ik het vrij risicovol om nu van baan te switchen. Bovendien moet ik er dan op vooruit gaan en dat is niet eenvoudig als ik naar vacatures kijk. Mijn beloning is namelijk wel marktconform.
Is een veelgehoord verhaal. Gaat helaas wel aan het punt voorbij dat microsoft nogal eens laks is met fixen van bugs of het leveren van support...
Dat zal ik ook zeker niet ontkennen :) Sterker nog, ik erger mij soms ook aan Microsoft's "het is gefixt in de volgende versie" beleid.
hmm... zeker geen gezonde werksfeer. Er is toch wel iets van leiding bij jullie projecten? Of doet iedereen maar wat, en hoe dat gebeurt is aan de developer zelf?
De leiding is vooral gericht op de projectvoortgang. Hoe we technisch te werk gaan bespreken de ontwikkelaars inderdaad zelf.

Hierbij moet ik wel opmerken dat de gemiddelde leeftijd bijna 40 is, dus we praten hier wel over senior ontwikkelaars. Het zijn geen juniors die maar wat aankloten :)
Hoe krijg je het voor elkaar om linq to sql traag te krijgen? :) Lazy loading all over the place?
Het zat hem vooral in de manier van gegevens ophalen. Inderdaad veel lazy loading, maar ook simpelweg meerdere Linq queries gebruiken om tot een bepaald resultaat te komen, wat ik in 1 keer kon regelen met een stored procedure.

Ik heb daardoor het aantal round trips naar de database enorm verlaagd, waardoor de performance erg verbeterde.

Mijn collega had er geen erg in, omdat in de testsituatie alles lekker liep, maar zodra het bij een klant stond en de hoeveelheid gegevens toenam begon het steeds trager te worden.

Het ging om een planningmodule met items die recurring kunnen zijn en als je dan de items van een bepaalde week opvraagt dan moet je de recurring items ook meenemen. Je kunt dan alle items nalopen en opvragen of ze in die week vallen, maar je kunt die logica dus ook in een stored procedure afhandelen (desnoods icm een scalar function) en het resultaat daarvan gewoon weer als planningitem teruggeven.

Dat soort dingen dus :)
Ja dat begrijp ik heel goed, en een soortgelijke situatie als waar jij inzit was een van de redenen om 17 jaar geleden voor mezelf te beginnen :)
:D

Ik heb daar ook vaak aan gedacht, anderzijds geeft een vaste baan mij wel veel gemoedsrust. Als zelfstandige ben je toch vaak bezig met de volgende opdracht binnen halen, klanten aansporen om die laatste factuur nou eens te betalen, etc, etc.

Dat is niet echt mijn ding. Ik hou mij liever met ontwikkelen bezig :)

Mijn vader had een eigen zaak en ik ben 3 jaar lang partner geweest in de VOF. Dat leverde een goed inkomen op destijds, maar ook een heleboel stress.
Je bent gek. Serieus. In de huidige markt zijn er legio developer jobs bij bedrijven die wel waarderen dat hun werknemers niet zo dom zijn als zijzelf. Het is jouw carriere natuurlijk.
Ik zal niet ontkennen dat ik weleens om mij heenkijk, mag ook wel na 6.5 jaar bij hetzelfde bedrijf te hebben gewerkt, maar zo heel slecht heb ik het niet hoor :)

Dat de leiding niet heel nauw kijkt op "hoe" je iets doet en vooral op "wat" je doet, heeft dus ook het voordeel dat je kunt experimenteren. Weliswaar op eigen risico (ivm deadline), maar ik heb al best veel geleerd door gewoon dingen uit te proberen.

Sommige zaken blijf je dan gebruiken omdat ze heel handig zijn, andere gaan weer de ijskast in.
Je kunt overal nieuwe dingen leren. Het gaat ook niet over 'handiger', het gaat over efficienter. En dat je dat uberhaupt in je eigen tijd moet doen anders gebeurt er uberhaupt niks... Niet gezond. Life's too short, Lethalis!
Mja, mijn nadeel is dat ik mijn HBO niet heb afgemaakt. Ik ben nog wel aan het studeren aan de Open Universiteit, maar er zijn helaas werkgevers HR afdelingen die alleen naar het papiertje kijken.

Persoonlijk vind ik een HBO opleiding te hersendodend om nu nog te doen na 10 jaar werkervaring, maar de vakken aan de OU daarentegen zijn wel interessant. In het kader van Life's too short leer ik nu vooral de dingen die ik interessant vind :)

PS:
Heeft er hier iemand eigenlijk ervaring met DevExpress XPO? Deze valt namelijk onder onze DevExpress Experience license :D

[ Voor 19% gewijzigd door Lethalis op 01-03-2014 10:06 ]

Ask yourself if you are happy and then you cease to be.

Pagina: 1