Avatar billede jonas_h Nybegynder
16. september 2010 - 22:34 Der er 7 kommentarer

Caching og Entity Framework 4

Jeg har lavet en større web app som bruger Entity Framework 4. Jeg bruger et Context-per-request design som indtil nu har virket perfekt.

Nu har jeg lagt et cachinglag ind over de entiteter som bliver brugt hele tiden, men er løbet ind i nogle problemer.

Et eksempel: Alle brugere er cachet. Alle brugere har tildelt 0..n roller og denne rolle-navigation er inkluderet i de bruger objekter der er cachet.

Når jeg ønsker at tilføje en rolle til en person via en webform, så er det altså den cachede bruger der hentes ud i koden og der tilføjes en rolle som er i object context'en. Når jeg skal gemme brugeren, vil jeg så attache denne til context'en og markere den som modified. Her får jeg et problem, da EF nu brokker sig over, at der eksisterer roller som allerede er i contexten (hvilket også er sandt nok).

Hvordan kommer jeg udenom dette problem? Findes der en slags "AttachIfNotAlreadyAttached" metode eller en måde man kan se om en entitiet allerede er attached? Jeg ville helst undgå at skulle detache rollerne i web-formen, da caching laget gerne skulle være "gennemsigtigt" og ikke have indflydelse på koden...
Avatar billede jonas_h Nybegynder
16. september 2010 - 23:03 #1
Glemte at nævne, at jeg bruger POCO entities med ChangeTRacking og det er følgende fejl jeg får:

The object cannot be attached because it is already in the object context. An object can only be reattached when it is in an unchanged state.
Avatar billede Syska Mester
16. september 2010 - 23:24 #2
Den er vel også attached ... dvs, den tror den er attached, men det er vel til en Context som ikke findes mere ... kan man ikke detach den inden du "cacher" den ?
Avatar billede jonas_h Nybegynder
16. september 2010 - 23:31 #4
Jeg detacher når jeg cacher.. Det er den rolle jeg add'er til User'ens collection den brokker sig over. For den rolle som tilføjes er i context'en når jeg prøver at attache User'en.
Avatar billede Syska Mester
17. september 2010 - 00:11 #5
hmmmm ... tænke tænke.

Så må du vel også detach din rolle, selvom det virker lidt wag.
Avatar billede jonas_h Nybegynder
17. september 2010 - 00:34 #6
Har faktisk lige fundet ud af, at det er User-objektet fra cachen som bliver lagt i context'en automatisk, når man tilføjer en Rolle til User'en. ChangeTrackingen gør at det sker.

Så nu har jeg løst det problem - nu er mit andet problem, at når jeg kalder SaveChanges() på datacontext, bliver der nogle gange oprettet nye roller i databasen, selvom det eksisterer i forvejen! Går ud fra, at dens ChangeState er sat til Added eller lignende.
Avatar billede Syska Mester
17. september 2010 - 00:40 #7
Yes ...

Men det lyder også mærkeligt, hvis key er sat ... så ville den jo lave ulykker da man ikke kan have samme key 2 gange.

EF4 er noget ... Arghhh, jeg er sådan så små startet på EF4 CodeFirst ... men ... jeg kan heldigvis hurtigt klar over til NHibernate hvis jeg skulle have brug for det.

mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester