Er flere Context klasser noensinne hensiktsmessig?

stemmer
28

For å dra full nytte LinqToSql i en ASP.net 3.5 søknad, er det nødvendig å skape Context klasser (som vanligvis skjer ved hjelp av designer i VS 2008). Fra UI perspektiv, er Context en utforming av deler av databasen som du ønsker å utsettes for gjennom LinqToSql og er integrert i å sette opp ORM funksjonene LinqToSql.

Mitt spørsmål er: Jeg setter opp et prosjekt som bruker en stor database hvor alle bordene er koblet sammen på noen måte gjennom Foreign Keys. Min første tilbøyelighet er å lage en stor Context klasse som modeller hele databasen. På den måten kunne jeg i teorien (selv om jeg ikke vet om dette ville være nødvendig i praksis) bruke fremmednøkkel tilkoblinger som genereres gjennom LinqToSql å enkelt gå mellom relaterte objekter i min kode, setter relaterte gjenstander, etc.

Men etter å gi det noen trodde, jeg nå tenker at det kan være mer fornuftig å opprette flere Context klasser, hver knyttet til en bestemt navnerom eller logisk henger seksjon i min database. Min største bekymring er at forekomster og kaster en stor Context klasse hele tiden for enkelte operasjoner som er knyttet til bestemte områder av Database ville være pålegge en unødvendig påbud på applikasjonsressurser. I tillegg er det enklere å opprette og administrere mindre Context filer enn en stor en. Det som jeg ville miste er at det ville være noen fjerne deler av databasen som ikke ville være farbar gjennom LinqToSql (selv om en kjede av relasjoner knytter dem i selve databasen). I tillegg vil det være noen bord klasser som vil eksistere i mer enn én Context.

Tanker eller erfaring om hvorvidt de flere DataContexts (tilsvarende DB navnerom) er passende i stedet for (eller i tillegg til) en meget stor klasse Context (svarende til hele DB)?

Publisert på 05/08/2008 klokken 05:54
kilden bruker
På andre språk...                            


5 svar

stemmer
26

Jeg er uenig med John svar. Den Context (eller Linq til Entities ObjectContext) er mer av en "arbeidsenhet" enn en forbindelse. Den håndterer sporing av endringer, etc. Se dette blogginnlegget for en beskrivelse:

Levetiden til et LINQ to SQL Datacontext

De fire hovedpunktene i dette blogginnlegget er at Context:

  1. Er ideell for en "arbeidsenhet" tilnærming
  2. Er også designet for "statsløs" serverdrift
  3. Er ikke konstruert for lang levetid bruk
  4. Should be used very carefully after
    any SumbitChanges() operation.
    

Tatt i betraktning at jeg tror ikke bruke mer enn en Context ville gjøre noen skade-faktisk lage forskjellige DataContexts for ulike typer arbeid vil bidra til å gjøre LinqToSql impelmentation mer usuable og organisert. Den eneste ulempen er at du ikke ville være i stand til å bruke sqlmetal å automatisk generere dmbl.

Svarte 07/08/2008 kl. 21:02
kilden bruker

stemmer
5

Jeg hadde vært krangel over samme spørsmålet mens retro montering LINQ til SQL over en arv DB. Vår database er litt av en whopper (150 tabeller), og etter noen trodde og eksperimentering jeg valgt å bruke flere DataContexts. Hvorvidt dette er ansett som et anti-mønster gjenstår å se, men for nå er det gjør livet overkommelig.

Svarte 05/08/2008 kl. 22:51
kilden bruker

stemmer
4

Jeg må være uenig med den aksepterte svaret. I spørsmålet som ble stilt, har systemet en eneste stor database med sterke utenlandske viktige relasjoner mellom nesten hver tabell (også tilfelle der jeg jobber). I dette scenariet, bryte den opp i mindre DataContexts (DC) har to umiddelbare og store ulemper (begge nevnt av spørsmålet):

  1. Du mister relasjoner mellom noen bord. Du kan prøve å velge DC grenser klokt, men du vil til slutt kjøre inn i en situasjon der det ville være svært praktisk å bruke et forhold fra en tabell i en DC til en tabell i en annen, og du vil ikke være i stand til.
  2. Noen tabeller kan vises i flere DC-tallet. Dette betyr at hvis du ønsker å legge til tabellspesifikke hjelpemetoder, forretningslogikk eller annen kode i delvis klasser, vil de typene ikke være kompatible på tvers av DC-tallet. Du kan omgå dette ved å arve hver enhet klasse fra sin egen spesielle base klasse, som blir rotete. Dessuten vil skjemaendringer må dupliseres på tvers av flere DC-tallet.

Nå de er betydelige ulemper. Er det fordeler stor nok til å overvinne dem? Spørsmålet nevner ytelse:

Min største bekymring er at forekomster og kaster en stor Context klasse hele tiden for enkelte operasjoner som er knyttet til bestemte områder av Database ville være pålegge en unødvendig påbud på applikasjonsressurser.

Egentlig er det ikke sant at en stor DC tar betydelig mer tid på å bruke eller bruke i en typisk arbeidsenhet. Faktisk, etter den første forekomst er opprettet i en kjørende prosess, etterfølgende kopier av den samme likestrøms kan opprettes nesten øyeblikkelig .

Den eneste virkelige fordelen av multippel DC er for en enkelt, stor database med grundige utenlandske viktige relasjoner er at du kan compartmentalize koden din litt bedre. Men du kan allerede gjøre dette med delvis klasser.

Dessuten er arbeidsenhet konseptet egentlig ikke relevant til det opprinnelige spørsmålet. Arbeidsenhet refererer vanligvis til hvor mye et arbeid en enkelt DC eksempel gjør, ikke hvor mye arbeid en DC klasse er i stand til å gjøre.

Svarte 17/06/2014 kl. 20:53
kilden bruker

stemmer
4

Jeg tror John er riktig.

"Min største bekymring er at forekomster og kaster en stor Context klasse hele tiden for enkelte operasjoner som er knyttet til bestemte områder av Database skulle innføre en unødvendig påbud på applikasjonsressurser"

Hvordan støtter dere det utsagnet? Hva er din eksperiment som viser at et stort Context er en forestilling flaskehals? Å ha flere datacontexts er mye som å ha flere databaser og gir mening i lignende situasjoner, det vil si nesten aldri. Hvis du arbeider med flere datacontexts du trenger for å holde oversikt over hvilke gjenstander som tilhører hvilken Context, og du kan ikke forholde seg gjenstander som ikke er i samme datasammenheng. Det er en kostbar utforming lukt for ingen reell nytte.

@Evan "The Context (eller Linq til Entities ObjectContext) er mer av en 'arbeidsenhet' enn en connection" Det er nettopp derfor du ikke bør ha mer enn én Context. Hvorfor skulle du ønske mer som en "arbeidsenhet" på en gang?

Svarte 27/08/2008 kl. 01:11
kilden bruker

stemmer
2

I min erfaring med LINQ to SQL og LINQ to Entities en Context er synonymt med en tilkobling til databasen. Så hvis du skulle bruke flere databutikker du trenger å bruke flere DataContexts. Min gut reaksjon er at du vil ikke merke til mye av en langsom ned med en Context som omfatter et stort antall tabeller. Hvis du gjorde derimot kan du alltids dele databasen logisk på punkter hvor du kan isolere tabeller som ikke har noe forhold til andre sett med bord og skape flere sammenhenger.

Svarte 05/08/2008 kl. 09:57
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more