Staram się decydować o zaletach i wadach 2 ORM głównie w tym obszarze.NHibernate vs. EF 4.1+
- Kompatybilność z SQL Server 2008 R2 & 2012.
- Jest to bardzo ważne, ponieważ po prostu nie mają środków do debugowania słabe wsparcie istniejących technologii MS stosu.
- Również planowanie z wyprzedzeniem od 2012 roku jest prawie niemożliwe i planuje się przeprowadzić migrację do niego.
- Wsparcie dla .NET 4.0 i 4.5 (nadchodzący)
- Ponownie bardzo ważne dla prawie tego samego powodu powyżej.
- Obsługa transakcji i wskazówki dotyczące tabel, np. forcecan forceseek, czytaj bez zaproszenia.
- Wiele razy optymalizator zapytań wykonuje swoją pracę dobrze, innym razem chcę elastyczność, aby powiedzieć, co robić.
- Wsparcie dla rozmowy, śledzenie siebie przywiązują & odłączyć
- Jest to nieco podstawowe. Nienawidzę, aby sesja była otwarta przez dłuższy czas. Zwłaszcza w środowisku przetwarzania rozproszonego/środowiska sieciowego.
- Możliwość obsługi kodu rozwijającego się, tworzenia i aktualizowania schematu bez niszczenia danych.
- Wydaje się, że EF 4.1 jest chciany pod tym względem, choć 4.3 jest lepszy i lepiej związany. Również polubienie adnotacji danych jest lepsze niż oddzielne klasy mapowania w NH. Powodem jest to, że chcę móc wysłać klasę, a stamtąd można stworzyć model trwałości bez rozszerzania metody dla klas mapowania.
- Wsparcie IRepository wzór
- Wsparcie dla LINQ
- Nieco przywiązany do (6) powyżej Chcę naprawdę dobre wsparcie dla LINQ. Nie chcę programistom syf wokół z realizacji niższego poziomu i zaczyna się przykleiła się do jednego konkretnego ORM
- Wydajność
- wsparcia dla operacji CRUD luzem, bez konieczności ładowania danych w warstwie aplikacji. Na przykład. Chcę zwiększyć wszystkie wiersze w kolumnie konkretnej tabeli o 1. Nie chcę ładować tego do pamięci i zwiększać wiersze jeden po drugim. To byłoby szalone z powodu tak prostej operacji. Linq2Sql kiedyś miał Magiqa do obsługi tego typu rzeczy, co mają NH i EF?
- Buforowanie, szybkie ładowanie, opóźnione ładowanie, właściwości nawigacyjne.
- Powiem szczerze, nienawidzę tych rzeczy, gdy robię to bezwarunkowo. Powód, dla którego trudno odróżnić to, co jest zbuforowane, nieaktualne od tego, co nowe. W EF zwykle zrzucam wszystkie właściwości nawigacji, ponieważ nie chcę, aby te właściwości były ładowane z top 5, ponieważ tego właśnie potrzebuje obecna operacja, ale w dalszej części strumienia inny programista próbuje wykonać obliczenie, które będzie niedokładne.
- Tak więc moja polityka osobista - wszystkie SOA będą bezpaństwowcami, chyba że istnieje ku temu uzasadniony powód. Jeśli potrzebujesz danych odniesienia, pozbądź się go. Będzie wolniejszy, ale kod będzie bardziej czytelny i elastyczny.
- Podobnie do buforowania. Jest wystarczająco złożony, ponieważ jest w środowisku rozproszonym, chcę, aby wszystkie buforowanie było bardzo bardzo wyraźne. Jeśli programista chce kodować pamięć podręczną, powinien to zrobić, a nie kodować do ORM i sprawić, aby wyglądał tak, jakby wyciągał świeże dane z trwałości, gdy w rzeczywistości uzyskuje on nieaktualne dane.
- Teraz pytanie brzmi, czy NHibernate ma jakąkolwiek koncepcję/abstrakcję, która powodowałaby, że buforowanie, przyspieszone/leniwe ładowanie było znacznie bardziej wyraźne niż obecnie dostępne w EF. W tym przypadku nie dbam o łatwość rozwoju, bardziej zależy mi na przejrzystości i jasności.
Również nie obchodzi mnie dużo dla OSS vs. propietary argument. Zespół nie może sobie pozwolić na zerknięcie pod kaptur i zaczepianie się za pomocą kodu innych ludzi. Dbam więcej o kąt "po prostu działa" niż cokolwiek innego.
dobrze napisana pytanie, choć obawiaj się, że jest to trochę otwarte dla SO; Pytania tutaj zwykle/często mają jakiś kod źródłowy i powinny prowadzić do jasnych, praktycznych odpowiedzi. Być może lepiej pasuje do Programmers.SE? – Jeroen