Ved at bruge EF til at manipulere databasen, udtrække DbContext (databaseoperation-kontekstklassen) i samme HTTP-anmodning for at sikre unikhed, bruger artiklen to skemaer til at sikre Unikhed af Entity Framework-konteksten, og løsningen på .NET Core-platformen er vedhæftet.
Mulighed 1
Hvis et objekt er garanteret at være globalt unikt, vil du helt sikkert tænke på et klassisk designmønster: singleton-tilstand, hvis objektet, der skal bruges, skal være unikt i tråden?
Dataslot: CallContext, se msdn's forklaring af callcontent.
CallContext er et dedikeret samlingsobjekt, der ligner et trådlokalt lager til metodekald, og tilbyder en dataplads, der er unik for hver logisk eksekveringstråd. Dataslots deles ikke mellem kaldskontekster på andre logiske tråde. Objekter kan tilføjes til CallContext, når den bevæger sig frem og tilbage langs eksekveringskodens sti og inspiceres af individuelle objekter i den sti.
Det vil sige, at den aktuelle tråd gemmer objektet i trådens lokale lager, og objektet ødelægges, mens tråden ødelægges.
Brug kode:
Brugsscenarier: Jeg mener personligt, at det bruges, når objektet skal bruges globalt inden for tråden, og de andre tråde i trådens pakkeudvidelser ikke kan få adgang til det. For eksempel vil der i EF's datakontekst blive genereret en tråd for hver forespørgsel, og på dette tidspunkt vil et datakontekstobjekt blive oprettet, som forskellige funktioner kan bruge og til sidst commit sammen for at undgå transaktionsproblemer. Selvfølgelig vil nogle spørge mig, om jeg kan oprette en variabel at bruge, som selvfølgelig også kan opnå samme formål, men dette objekt kan også interagere med andre tråddata, hvilket går imod konceptet om at være unikt i tråden.
Mulighed 2
Scenariet er baseret på web-http-forespørgsler, fordi hver anmodning er en ny tråd, og koden er som følger:
Brug af "CallContext" i .NET Core
Vi ved, at CallContext ikke længere er tilgængelig for . NETStandard eller .NET Core.
Men du kan bruge Asynclocal<T> til at efterligne en CallContext, bare opret følgende statiske klasse:
Navnerum, der skal refereres:
Det er også nemt at bruge (her har jeg lagt CallContext i Common-biblioteket):
|