2011-01-06 13 views
9

Jakie są zalety korzystania z jednego nad drugim? Wiem, że klasy POCO są bardziej optymalne, ale czy warto je przesadzać? I czy zawsze powinniśmy używać POCO, czy jest czas, w którym powinieneś preferować klasy ramek encji?POCO Vs Entity Framework Generated Classes?

Odpowiedz

8

Wszystkie domyślne klasy EF dziedziczą z klasy bazowej EF, a POCO nie (stąd nazwa). Podczas dziedziczenia z klasy bazowej EF, logika śledzenia zmian jest ukryta przed tobą, a cała logika jest przechowywana w kontekście, w którym przechowywane są odniesienia do twoich obiektów. Jest to preferowane, jeśli pracujesz w stanie połączonym, tzn. Masz kontekst w tym samym czasie, gdy masz jednostki. Zazwyczaj ma to miejsce w przypadku budowania "grubego" klienta, więc klient i baza danych są jedynymi dwoma poziomami.

Z drugiej strony, jeśli pracujesz z usługami sieciowymi/formularzami sieciowymi, podmioty, które przekazujesz, nie mają kontekstu i muszą sami śledzić stan - wtedy POCO jest lepszym rozwiązaniem, ponieważ mieć obiekt śledzenia zmian jako swoją własność, którą można przenosić, dopóki nie zdecydujesz się zastosować zmian do kontekstu i zapisać. Inną korzyścią jest to, że Twoi klienci nie muszą być .NET i nie muszą mieć pliku .dll, aby deserializować obiekty.

2

Powodem, dla którego używam POCO, jest oddzielenie obaw, tzn. Nie chcę, aby mój front end musiał wiedzieć, jak działa mój back-end. Więc jeśli chcę zmienić Linq To Sql na EF lub N Hibernate, nie muszę modyfikować mojego kodu początkowego.

2

Użyj POCO, jeśli chcesz mieć czystą architekturę, luźne połączenie i najwyższą testowalność.

Jeśli nie dbasz o te rzeczy, nie używaj ich.

Osobiście dla mnie są to najważniejsze rzeczy w każdej aplikacji (szczególnie ta, która jest wymagana do utrzymania przez długi czas), dlatego zawsze używam POCO.

Mając to na uwadze, POCO wymaga wdrożenia pewnego rodzaju mechanizmu śledzenia zmian, co może być trudne. Ale jest to jednorazowa konfiguracja i jest warta wysiłku.

Mam tę logikę w niestandardowej bibliotece DLL, którą dzielę między projektami - więc nie muszę ciągle tego robić.

Aby uzyskać więcej informacji na temat powodów, dla których wartości POCO są ważne w znaczeniu ogólnym (nie dotyczy EF/.NET), zobacz moją odpowiedź here.

+0

Dlaczego nie po prostu reprezentują swoje "poco" z interfejsem, że zajęcia EF generowane można zaimplementować? Wtedy twój interfejs użytkownika (lub usługa wyższego poziomu) może uzyskać luźne sprzężenie i testowalność, wykorzystując zamiast tego tylko definicje interfejsów ... I nie będzie potrzeby zapisywania/wykonywania funkcji konwersji. – Reddog

+0

@Reddog - Cóż, mój zbiór POCO nie ma odniesień do 'System.Data.Entity', nie zależy od EF. Jeśli używasz klas wygenerowanych przez EF, biblioteka klas zostanie "powiązana" z EF. Jeśli chcę przejść do innej ORM (lub DAL), mogę ponownie użyć moich klas POCO. Tego samego nie można powiedzieć o klasach generowanych przez EF. Nie chodzi tylko o luźne sprzężenie z * innymi * projektami, chodzi o luźne sprzężenie pomiędzy POCO i samym Entity Framework. Pozwala to na prawdziwy "model domeny". – RPM1984

Powiązane problemy