Aplikacja, którą obecnie buduję, używa procedur przechowywanych i ręcznie wykonanych modeli klas do reprezentowania obiektów bazy danych. Niektóre osoby zasugerowały użycie Entity Framework i rozważam przejście na to, ponieważ nie jestem tak daleko w projekcie. Mój problem polega na tym, że ludzie, którzy kłócą się o EF, mówią mi tylko dobrą stronę rzeczy, a nie złą stronę :)
Moje główne obawy to:
- Chcemy sprawdzania poprawności po stronie klienta za pomocą DataAnnotations i wygląda na to, że i tak muszę tworzyć modele po stronie klienta, więc nie jestem pewien, czy EF zaoszczędziłby tyle czasu na kodowanie
- Chcielibyśmy, aby klasy były jak najmniejsze podczas przechodzenia przez sieć, i przeczytałem, że używanie EF często zawiera dodatkowe niepotrzebne dane
- Mamy złożoną warstwę bazy danych, która przecina wiele baz danych, i nie jestem pewien, czy EF sobie z tym poradzi. Mamy jedną wspólną bazę danych zawierającą informacje o użytkownikach, kodach statusu, typach itp. Oraz wiele instancji naszych głównych baz danych dla różnych instancji aplikacji. Zapytania SELECT mogą i będą wykonywać zapytania we wszystkich instancjach baz danych, jednak użytkownicy mogą modyfikować tylko obiekty znajdujące się w bazie danych, nad którą aktualnie pracują. Mogą przełączać bazy danych bez ponownego ładowania aplikacji.
- Tryby obiektowe są bardzo złożone i często wiąże się z nimi całkiem sporo połączeń
Argumenty za EF to:
- Konkurencja. Nie musiałbym kodować czeków, aby sprawdzić, czy rekord był aktualizowany przed każdym zapisem
- Generowanie kodu EF może generować dla mnie modele klas cząstkowych i POCO, jednak nie jestem pewien, czy naprawdę zaoszczędziłoby mi to tyle czasu, ponieważ uważam, że nadal będziemy musieli stworzyć modele po stronie klienta do sprawdzania poprawności i niektóre niestandardowe metody analizy.
- Szybkość rozwoju, ponieważ nie musielibyśmy tworzyć procedur przechowywanych CRUD dla każdego obiektu bazy danych
Nasza obecna architektura składa się z usługi WPF, która obsługuje wywołania bazy danych za pomocą sparametryzowanych procedur przechowywanych, obiektów POCO, które przechodzą do / z usługi WCF i klienta WPF, oraz samego klienta stacjonarnego WPF, który przekształca POCO w modele klasowe w celu walidacji i DataBinding.
Więc moje pytanie brzmi: czy EF jest do tego odpowiedni? Czy są jakieś pułapki związane z EF, o których nie wiem?
źródło
Odpowiedzi:
Ostatnio oceniałem Entity Framework, a najlepszym miejscem, w którym znalazłem problemy i brakujące funkcje, było: http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions
Elementy z największą liczbą głosów:
Istnieje wiele innych problemów na liście Głos użytkownika.
Na marginesie, jestem bardzo podekscytowany nadchodzącą wersją EF 4.1, która obejmie podejście Code-First ... http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4 -1-release-kandydat-dostępny.aspx
Może mnie to zmusić do wypróbowania EF w aplikacji produkcyjnej.
źródło
.ToList()
lub.ToArray
), zanim wyrażenia LINQ zostaną w pełni zdefiniowane. Dlatego pobiera wszystkie rekordy i spowalnia.Robienie gałęzi na błąd / funkcję za pomocą EF może być wyjątkowo bolesne w czasie łączenia. Wyobraź sobie, że dwie gałęzie A i B dokonują zmian w bazie danych (co prawdopodobnie zdarzy się często na wczesnych etapach nowego projektu).
Łączysz wszystkie „normalne” pliki - pliki cs itp. A potem nadszedł czas na połączenie Model.edmx. I nagle nie tylko scalasz logiczne odwzorowania między modelem obiektowym i bazą danych, ale także pozycjami tabel na diagramie encji.
Scalanie Model.edmx jest tak bolesne, że przyjęliśmy dość nieprzyjemny sposób, który działa:
źródło
Istnieje kilka innych korzyści dla EF, których brakuje:
Wady (szczególnie jeśli korzystasz z walidacji):
object
typami, więc po prostu odczytaj metadane. Wciąż dużo dodatkowego nieaktywnego kodu.To dwie największe skargi, jakie mam. Jest wiele korzyści, ale bardzo dobrze możesz uzyskać te same korzyści z NHibernate. Jeśli EntityFramework jest na stole, poproś zespół, aby sprawdził również NHibernate i zrobił krótką strzelaninę za / przeciw za twój projekt.
Problem z klasą metadanych powoduje ból głowy, ale na szczęście mam tylko tyle jednostek, które potrzebują tagów sprawdzania poprawności.
Brak prawdziwego trybu odłączonego dla obiektów ogranicza to, co można zrobić w środowisku sieciowym. Tryb dołączony jest lepszy dla aplikacji komputerowych, stąd powstało wiele innowacji Microsoft. Tryb odłączony jest możliwy , ale bardzo bolesny. W takim przypadku najlepiej jest użyć alternatywnego narzędzia.
źródło
using(EFConnection conn = new EFConnection)
konstruktu. Jeśli spróbujesz schować gdzieś ten obiekt w celu bezpiecznego przechowywania, abyś mógł wykonać szybką aktualizację i zapisać go ponownie w drugiejusing(...)
instrukcji, musisz pomyśleć jeszcze raz. Zobacz msdn.microsoft.com/en-us/library/bb896271.aspx i msdn.microsoft.com/en-us/library/bb896248.aspx . Używanie EF 3.5 (którego musiałem użyć w ostatniej wersji) nie jest nawet tak czyste.Jedną rzeczą, Microsoft nie jest bardzo dobra w jest wstecznie
porównywalnośćkompatybilności, szczególnie jeśli chodzi o nowe technologieW szczególności EF1 (.net 3.5) bardzo różni się od EF4 (.net 4.0) - to samo może wystąpić w następnej wersji.
Poczekam chwilę i zobaczę, jak technologia dojrzewa.
W międzyczasie zastanów się nad użyciem nHibernate - nie jest równoważne, ale jest dojrzałe i dziko używane.
źródło
złamania ...
Mógłbym napisać 10 stronicową diatrybę. Ale jeśli tylko piszesz jakąś wyrzuconą aplikację dla Firmy X, kogo to obchodzi. Ale jeśli tworzysz oprogramowanie, musisz być bardziej analny
źródło
Sprawdź to: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/
Główne punkty to:
Zauważ, że powyższy link mówi o EF1.
Również ten link: http://ormeter.net/ pokazuje, że EF nie jest najlepszy w porównaniu z innymi ORM pod względem wydajności i obsługi LINQ.
źródło