2008-10-27 29 views
7

Właśnie zacząłem tworzyć moją warstwę dostępu do danych za pomocą LinqToSql. Wszyscy mówią o fajnej składni i ogólnie lubię Linq.Najlepsze praktyki LinqToSql

Ale kiedy zobaczyłem, jak generowane są twoje klasy, jeśli przeciągasz kilka tabel na LinqContext, zdziwiłem się: tyle kodu, którego nikt by nie potrzebował ?!

Więc przyjrzałem się, jak inni ludzie używali LinqToSql, na przykład Rob Connery w jego StoreFront Demo.

Ponieważ nie podoba mi się sposób, w jaki generowany jest cały ten kod, ręcznie stworzyłem warstwę domeny i użyłem wygenerowanych klas jako odniesienia. Dzięki takiemu rozwiązaniu mam się dobrze, bo mogę korzystać z funkcji dostarczanych przez Linq (dereferred wykonanie, leniwe ładowanie, ...) i moja warstwa domeny jest dość łatwa do zrozumienia.

W jaki sposób używasz LinqToSql?

Odpowiedz

6

Utworzone klasy nie są tak ciężkie, jak się wydaje. Oczywiście zajmuje sporo linii kodu, ale w sumie jest tak lekki, jak może być dla funkcji, które oferuje.

Kiedyś tworzyłem własne tabele, ale teraz zamiast tego używam LINQtoSQL DataContext. Czemu? Tworzenie jest prostsze, funkcje są lepsze, współpraca działa, jest prawdopodobnie nawet szybsza niż moje własne rzeczy (nie w każdym aspekcie.) Zwykle moje własne rzeczy były niezwykle szybkie w jednym, ale ogólne rzeczy były szybsze we wszystkim innym).
Ale najważniejsza część: łatwiej jest wprowadzić nowych programistów do rzeczy LINQ niż do moich własnych. Są tutoriale, przykładowe kody, dokumentacja, wszystko, co sam musiałbym stworzyć dla mojego kodu. To samo dotyczy używania moich rzeczy z innymi technologiami, takimi jak WCF lub powiązanie danych. Istnieje wiele pułapek, którymi należy się zająć.

Nauczyłem się nie rozwijać się w zakręty na własnej skórze, wygląda szybko i łatwo na początku, jest o wiele więcej zabawy niż nauka korzystania z bibliotek, ale jest prawdziwym bólem po kilku miesiące w dół drogi, zazwyczaj nawet dla mnie.

Po pewnym czasie nowość tworzenia własnych kontenerów danych zanika i zauważyłem ból związany z dodawaniem funkcji. Funkcja, którą miałbym za darmo, gdybym użył dostarczonych klas.
Następną rzeczą było wyjaśnienie mojego kodu innemu programistowi. Gdybym użył dostarczonych klas, mógłbym wskazać mu jakąś stronę internetową, by dowiedzieć się o tym. Ale na moje zajęcia musiałem sam go wyszkolić, co zajęło dużo czasu i utrudniło pozyskanie nowych ludzi do projektu.

0

Użyj skompilowanych zapytań. Linq do SQL w innym wypadku jest powolny. Really.

+0

Jestem naprawdę zainteresowany tym, dlaczego to zostało odrzucone. Używamy Linq-to-SQL w produkcji i musieliśmy przepisać większość zapytań na skompilowane i uzyskaliśmy z tego 10x wzrost wydajności. – bh213

0

Używamy naszego ręcznie opracowanego modelu domeny, wraz z wygenerowanymi klasami oraz prostego narzędzia, które wykorzystuje odbicie do konwersji między nimi w razie potrzeby. Zastanawialiśmy się nad napisaniem generatora konwerterów, jeśli dojdziemy do punktu, w którym odbicie tworzy wąskie gardło wydajności.

+0

Rozważyłem to również, ale poszedłem drogą, którą wspomniał Jeff Fritz. Bez refleksji! – Vyrotek

4

LinqToSql generuje zestaw klas cząstkowych dla twoich tabel. Możesz dodać definicje interfejsu do "drugiej połowy" tych klas częściowych, które implementują twój model domeny.

Następnie, jeśli użyjesz wzorca repozytorium do zawijania dostępu do zapytań Linq, tak aby zwracały implementacje interfejsu twoich obiektów (bazowe obiekty Linq), LinqToSql staje się dość elastyczny.

+0

Zamierzałem opublikować dokładnie to. Miło słyszeć, że inni używają go w ten sposób. – Vyrotek

+0

Mój zespół używa podobnej techniki z mocno wpisanymi zestawami danych, dodając implementacje interfejsu do klas częściowych, które generuje Vs.Net –

+0

Czy są to przykłady kodu? Zasadniczo napisałem swoją domenę za pomocą modelu wtrysku zależności, aby sfałszować db. Teraz robię moje LINQ do bazy danych SQL i walczę, aby dowiedzieć się jak skutecznie odwzorować mój obiekt biznesowy x z moim obiektem linq x bez jakiejś lame konwersji – qui

1

Można ręcznie pisać własne klasy i albo użyć atrybutów LINQ do SQL, aby zadeklarować odwzorowania lub zewnętrzny plik XML.

Jeśli chcesz pozostać przy istniejącym projektancie i po prostu zmodyfikować proces generowania kodu, wybierz mój templates that let you tailor the generated code.