Wiele klas DataContext są zawsze właściwe?

głosy
27

Aby w pełni wykorzystać LinqToSql w aplikacji ASP.NET 3.5, konieczne jest stworzenie DataContext klas (które zwykle odbywa się przy użyciu projektanta w VS 2008). Z punktu widzenia UI, DataContext jest konstrukcja sekcji bazy danych, które chcesz narażać się poprzez LinqToSql i jest integralną częścią w tworzeniu funkcji ORM z LinqToSql.

Ja ustanowienia projektu, który wykorzystuje dużą bazę danych, gdzie wszystkie tabele są połączone ze sobą w jakiś sposób za pomocą kluczy obcych: Moje pytanie brzmi. Moje pierwsze nachylenie jest, aby jeden ogromny klasy DataContext, który modeluje całą bazę danych. W ten sposób mogłem teoretycznie (choć nie wiem, czy byłoby to potrzebne w praktyce) użyć klucza obcego połączenia, które są generowane przez LinqToSql łatwo przejść między powiązanymi obiektami w moim kodu, włóż powiązanych obiektów, itd

Jednak po nadając mu jakąś myśl, jestem teraz myśli, że może więcej sensu, aby utworzyć wiele klas DataContext, każdy odnoszący się do konkretnej przestrzeni nazw lub logicznej części powiązane w ramach mojej bazy danych. Moim głównym problemem jest to, że instancji i utylizacji jeden ogromny klasy DataContext cały czas dla poszczególnych operacji, które odnoszą się do konkretnych obszarów Bazie będzie nakładać niepotrzebnych nałożenie na zasobach aplikacji. Ponadto łatwiej jest tworzyć i zarządzać mniejsze pliki DataContext niż jednego dużego. Rzeczą, że stracę to, że nie będzie pewne odległe odcinki bazy danych, która nie byłaby żeglowna przez LinqToSql (choć sieć relacji łączy je w rzeczywistej bazy danych). Dodatkowo, nie byłoby niektóre klasy stołowe, które istnieją w więcej niż jednym DataContext.

Wszelkie myśli i doświadczeń na temat tego, czy wielu DataContexts (odpowiadające nazw DB) są odpowiednie zamiast (lub oprócz) jednej bardzo dużej klasy DataContext (co odpowiada całej DB)?

Utwórz 05/08/2008 o 06:54
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
25

Nie zgadzam się z Jana odpowiedź. DataContext (lub LINQ do podmiotów ObjectContext) jest bardziej „jednostki pracy” niż połączenia. Zarządza śledzenie zmian, itp Zobacz ten post na blogu z opisem:

Żywotność LINQ do SQL DataContext

Cztery główne punkty tego blogu jest to, że DataContext:

  1. Idealnie nadaje się do „jednostka pracy” podejście
  2. Jest przeznaczony również dla „bezpaństwowiec” pracy serwera
  3. Nie jest przeznaczony do użycia długowieczne
  4. Should be used very carefully after
    any SumbitChanges() operation.
    

Biorąc pod uwagę, że nie sądzę, używając więcej niż jednego DataContext zrobi żadnej nieszkodliwe w rzeczywistości, tworząc różne DataContexts dla różnych rodzajów pracy pomogłoby uczynić LinqToSql impelmentation więcej usuable i zorganizowane. Jedynym minusem jest to, że nie będzie w stanie wykorzystać SQLMetal do automatycznego generowania swoją dmbl.

Odpowiedział 07/08/2008 o 22:02
źródło użytkownik

głosy
4

Ja już spory nad tym samym pytaniem, podczas gdy modernizacja LINQ to SQL nad DB starszych. Nasza baza jest trochę Whopper (150 tabelach) i po namyśle i eksperymentowania I wybrany do korzystania z wielu DataContexts. Czy to jest uważany za anty-wzorzec się okaże, ale na razie to sprawia, że ​​życie w zarządzaniu.

Odpowiedział 05/08/2008 o 23:51
źródło użytkownik

głosy
3

Muszę zgodzić się z przyjętym odpowiedź. Na postawione pytanie, system ma jedną dużą bazę danych z silnymi obcych kluczowych stosunków między prawie każdym stole (również w przypadku, gdzie pracuję). W tym scenariuszu, rozbijając go na mniejsze DataContexts (DC) ma dwie natychmiastowe i poważne wady (zarówno wymienione w pytaniu):

  1. Tracisz relacji między niektórych stołach. Można spróbować wybrać swoje granice DC mądrze, ale wcześniej czy później napotkasz sytuacji, w której byłoby to bardzo wygodny w użyciu relacji z tabeli w jednym DC do tabeli w innym, a nie będą mogli.
  2. Niektóre tabele mogą pojawić się stwardnienie DC. Oznacza to, że jeśli chcesz dodać metody tabeli specyficzne pomocnik, logiki biznesowej lub inny kod w częściowych klas, typy nie będą kompatybilne całej DC. Można to obejść przez dziedziczenie każdej klasy podmiot z własnej specyficznej klasy podstawowej, który dostaje bałagan. Ponadto, zmiany schematu będą musiały być powielane w wielu DC.

Teraz są to znaczące wady. Czy istnieją zalety wystarczająco duże, aby je przezwyciężyć? Pytanie wspomina wydajność:

Moim głównym problemem jest to, że instancji i utylizacji jeden ogromny klasy DataContext cały czas dla poszczególnych operacji, które odnoszą się do konkretnych obszarów Bazie będzie nakładać niepotrzebnych nałożenie na zasobach aplikacji.

Właściwie, to nie jest prawdą, że duża DC zajmuje znacznie więcej czasu instancji lub wykorzystania w typowej jednostce pracy. W istocie, po pierwsze wystąpienie jest tworzony w uruchomionego procesu, kolejne kopie tego samego DC mogą być tworzone niemal natychmiast .

Jedyną zaletą z wielu DC dla jednej, dużej bazy danych, przy dokładnym obcych kluczowych relacji jest to, że można dzielą swój kod trochę lepiej. Ale można już robić to z częściowym klas.

Ponadto, jednostka koncepcji pracy naprawdę nie jest istotne do pierwotnego pytania. Jednostka pracy zazwyczaj odnosi się do ile praca pojedyncza DC instancja robi, a nie, jak wiele pracy DC klasa jest w stanie zrobić.

Odpowiedział 17/06/2014 o 21:53
źródło użytkownik

głosy
3

Myślę, że John jest prawidłowe.

„Moim głównym problemem jest to, że instancji i utylizacji jedna wielka klasa DataContext cały czas dla poszczególnych operacji, które odnoszą się do konkretnych obszarów Bazie będzie nakładać niepotrzebnych nałożenie na zasobach aplikacji”

Jak można wesprzeć to oświadczenie? Jaki jest Twój eksperyment, który pokazuje, że duża DataContext jest wąskim gardłem wydajności? Posiadanie wielu datacontexts jest dużo jak o wielu baz danych i sens w podobnych sytuacjach, czyli prawie nigdy. Jeśli pracujesz z wieloma datacontexts trzeba śledzić, które obiekty należą do którego datacontext i nie może dotyczyć przedmiotów, które nie są w tym samym kontekście danych. Jest to kosztowny projekt zapach bez realnej korzyści.

@Evan „DataContext (lub LINQ do podmiotów ObjectContext) jest bardziej«jednostki pracy»niż połączenie” właśnie dlatego nie powinien mieć więcej niż jeden datacontext. Dlaczego chcesz więcej niż jedną „jednostkę pracy” na raz?

Odpowiedział 27/08/2008 o 02:11
źródło użytkownik

głosy
1

Z mojego doświadczenia z LINQ to SQL i LINQ to podmioty A DataContext jest synonimem połączenia z bazą danych. Więc jeśli były do ​​korzystania z wielu magazynów danych trzeba by użyć wielu DataContexts. Mój gut reakcja jest nie zauważy się znacznie od spowolnienia z DataContext, który obejmuje dużą liczbę stołów. Jeśli tak jednak zawsze można podzielić logicznie bazy danych w punktach, gdzie można wyizolować tabele, które nie mają żadnego związku z innymi zestawami tabel i tworzenie wielu kontekstach.

Odpowiedział 05/08/2008 o 10:57
źródło użytkownik

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