SPee schreef op woensdag 25 maart 2015 @ 13:21:
[...]
Hoezo niet voorspelbaar?
M.i. als EF detecteerd dat het object niet vanuit de DB komt, dan betekent het voor EF dat deze aangemaakt moet worden. Als jij dan dat nieuwe object als referentie gebruikt, dan moet EF ook die persisteren, om aan de DB constraints te voldoen. En wordt bij het aanmaken de AuthorId gezet met de nieuwe aangemaakte waarde. En wordt het object aangemerkt als 'verbonden met db'.
Je moet dan niet een nieuwe Author object aanmaken, maar een referentie uit EF ophalen.
(vanuit het oogpunt van een java ontwikkelaar
)
In de definitie van het object staat geïdentificeerd wat de primary key van het object is, m.i. zou EF slim genoeg moeten zijn om dan te bepalen "Hey, het is een bestaand object. Laat ik dus een update dáárop doen i.p.v. een nieuwe insert" - zo zou ik het tenminste zelf implementeren.
Uiteindelijk ben ik gaan doen
wat Megamind al zei, ik zet de FK-identifier en de rest zal me aan m'n reet roesten. Dat het childobject überhaupt werd ingevuld was eigenlijk een bugje, dat eerst niet opviel omdat alles uit dezelfde DbContext kwam.
F.West98 schreef op woensdag 25 maart 2015 @ 14:37:
[...]
Klinkt inderdaad vrij slecht, maar nu ik het zo hoor is het wel een goede oplossing voor een probleem wat ik een tijd geleden had (meerdere soorten lictenties voor producten, en elke soort licentie heeft een andere inlogvorm (username/pass, code, enz), huidige oplossing vereist dat iedere nieuwe soort een nieuwe class heeft in het model en ook een eigen manier van verwerken heeft in de code.) Maar hoe werk je dan met dit soort gegevens? Je hebt dus niet een 'model' dat compiletime wordt gevalideerd...
Als je met EAV wilt werken moet je zelf verdomde goed weten welke datatypes je hebt, hoe je relaties liggen en hoe je de data consistent houdt. Er is tenslotte geen enkele vorm van referentiële integriteit of constraints meer.
Als je model hierop is ingericht hoeft het geen probleem te zijn, maar je moet verdomd goed in de gaten houden waar je mee bezig bent.
Volgens mij heb ik dat dan ook eens gehad. Ik zit in een tabel met max. 300 entries ook al ineens op 6k+ als ID....
Klinkt als hetzelfde ding.

Hmm interessant. Misschien daar eens naar kijken voor mijn webclient. Op dit moment heb ik gewoon concurrentconnectiondinges aangezet, dat werkt prima. Het is ook nodig voor een ander (threaded) proces die meerdere connections nodig heeft om geen concurrentmodificationexceptions te krijgen (of hoe die ook maar mogen heten in C#).
Unity (of soortgelijke producten zoals Autofac, Ninject, enz.) is heerlijk. In het begin is het even wennen, maar het maakt het zoveel makkelijker om je code te testen, of bijvoorbeeld om dingen aan te passen.
Stel, ik heb een klasse met de volgende constructor:
C#:
1
2
3
| public class AccessValidator {
public AccessValidator (IUnitOfWork, IScriptEngine scriptEngine, IFailureHandler failureHandler) { ... }
} |
Als ik hier nu iets aan toevoeg of wijzig hoef ik niet op 30 plekken (5 echte plekken + 25 unit tests) de new-call aan te passen, Unity zorgt er wel voor dat alles blijft werken en dat ik de juiste objecten binnenkrijg.
Wat ik hier doe heet 'constructor injection', een alternatief wat je ook wel ziet is 'property injection' (waarbij de waarde van properties wordt gezet op instances van objecten) maar dat vind ik er altijd een beetje lelijk uitzien. Met constructors maak je tenminste meteen duidelijk wat de afhankelijkheden zijn die een klasse heeft, waarbij dat met properties minder in-your-face is...
Jan_V schreef op woensdag 25 maart 2015 @ 15:00:
[...]
Kijk wel uit met het implementeren van EAV.
Sowieso is het leuk om een keer voor een hobby/schoolopdracht te gebruiken, zodat je weet hoe het werkt en wat de voor- en nadelen zijn. Voor een klant inzetten is iets wat je in eerste instantie beter niet kunt doen, tenzij je zeker weet dat er voldoende voordelen zijn die van groter belang dan de bijkomende nadelen.
Eens.
In het geval van Alex ga ik er vanuit dat dit vantevoren goed is doordacht

Ja, er is zeker goed over nagedacht. We hadden zulke functionaliteit gewoon nodig omdat er veel voorwaarden zijn aan wanneer bepaalde informatie ingevuld mag/moet worden, en dat liet zich niet vangen in een gewone tabelstructuur.
Wat ik doe is dat ik alle gekozen waardes in een Dictionary<string, List<string>>* gooi, die ik vervolgens weer aan een paar IronPython-scripts voer. Die scripts halen informatie uit die dictionary om er weer verdere bewerkingen op te doen.
* In mijn datamodel heb ik enkel te maken met strings, vandaar de keuze voor dat type.