Open bartvanderwal opened 4 weeks ago
Ik wil dit 'aantalSecondenOmTeBereken' ook opslaan in de database, samen met het starttijdstip van de berekening (tijd én datum in UTC) om op te slaan in de database. Dit moet de MemoizingPriemChecker dan doen. Die moet als innerChecker de PriemCheckerMetSnelheidsMeting krijgen.
Ik heb de volgende code, maar hoe bepaal je de huidige DateTime
, op de regel waar achter de =
nog iets moet komen?
// Anders de interne service gebruiken om te berekenen.
var result = _innerService.IsPriemgetal(number);
var huidigeDateTime = ;
// Resultaat opslaan in database
_context.PriemCheckResultaten.Add(new PriemCheckResultaatEntity(
number,
result.IsPriemgetal,
result.AantalLoops,
result.AantalSecondenOmTeBerekenen,
huidigeDateTime,
));
_context.SaveChanges();
Ik heb nu subtaak 1 gedaan, en laat rename voor 2 nog even zitten maar:
Bij het uitvoeren van dotnet ef migrations add
krijg ik echter een error op de BigInteger
.
Ik wil upgraden voor priemchecks en dus voor PriemCheckResultaat waarden, ook in de database van 'int' (ingeger) naar een BigInteger. Maar bij runnen dotnet ef migrations add PriemCheckResultaatBigIntVoorKandidaatEnMeerMetaData krijg ik een error dat EF Core helemaal geen BigIntegers ondersteunt. Zie foutmelding onder.
Unable to create a 'DbContext' of type 'PriemChecker.Persistence.PriemCheckContext'. The exception 'The 'BigInteger' property 'PriemCheckResultaatEntity.PriemKandidaatWaarde' could not be mapped because the database provider does not support this type. Consider converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
Kortom:
Unable to create a 'DbContext' of type 'PriemChecker.
TimedPriemChecker
maken.Die weer een decorator pattern gebruikt om zijn
_innerChecker
de echt check te laten doet, maar (als decoratie) de tijd meet in milliseconden dat het bepalen erover doet. Zodat we dit ook kunnen teruggeven en opslaan. Kun je de code van (alleen) zo'n StopWatch stukje geven om de call naar de innerchecker heen (in C#)?-->
Na overleg met ChatGPT noem ik deze
TimedPriemChecker
nu NL:PriemCheckerMetSnelheidsMeting
SimpelPriemChecker
enNuGetPriemChecker
moet wellicht ook een betere naam komen zoals 'NaievePriemCheckerrespectievelijk
MillerRabinpriemChecker`want over dat laatse vind ik dan wel niets in de README ervan o.i.d. maar deze term die ook op Wikipedia staat komt wel in de codebase voor: https://github.com/Open-NET-Libraries/Open.Numeric.Primes/blob/master/source/MillerRabin.cs