W Controllerach używają oni też modelu bespośrednio stworzonego przez Entity Framework, gdzie na innych tutorialach czytalem że jest to duży błąd. Mógłby ktoś kto pracuje w tym i używa Entity Framework 6 z MVC 5 napisać jak to się stosuje w praktyce?
Nie ma znaczenia, jakiego ORMa, ani jakiego frameworka używasz. Jeśli chcesz trzymać się wzorca MVC, to w kontrolerze NIE używasz ani repozytoriów, ani obiektu ORMa bezpośrednio. Jedyne, z czego kontroler powinien korzystać to serwis aplikacyjny albo klient webserwisów (jeśli oczywiście taka warstwa fizyczna jest w systemie).
W praktyce częste jest używanie zarówno repozytoriów (które same z siebie w większości przypadków są zbędne) jak i DbContextu w kontrolerach. Jest podejście niepoprawne, rodzące masę problemów wydajnościowych (select n+1, pobieranie zbędnych danych, leniwe ładowanie połowy bazy danych do pamięci) oraz utrudniające rozwój aplikacji. No, ale niestety, u programistów powszechne jest niezrozumienie wzorca MVC i uznawanie tutoriali Microsoftu za wzór architektury aplikacji.
W przypadku złożonych systemów często posiadasz dane z różnych źródeł np. z web serwisów, jakichś plików XML, bazy danych. Wówczas dobrze mieć odpowiednią warstwę abstrakcji odpowiadającą za dostęp do danych (Data Access Layer) np. poprzez zastosowanie wzorca Repository.
Repository to NIE jest DAL!!!
Repozytorium to obiekt, który daje logice biznesowej imitujący kolekcję interfejs dostępu do obiektów biznesowych. Czyli ma metody w rodzaju Add
, Update
, Delete
i FindBy*
. Repozytorium może korzystać z bazy danych, do której dostęp może być realizowany za pomocą innego wzorca, np. ORM (albo np. Table Data Gateway albo Row Data Gateway), a mogą to też być dane trzymane w plikach XML, albo odwołania do zewnętrznego systemu przez webserwisy. Źródło danych jest nieistotne, istotne jest API.
Osobiście nie widzę nic złego w przypadku stosowania tego wzorca razem z narzędziem ORM jakim jest Entity Framework. Zaletą takiego rozwiązania jest łatwość testowania takiego kodu.
Tylko, że od wersji 6 wprowadzono do EF interfejsy, więc można już normalnie mockować kod do testów bez potrzeby tworzenia bezsensownej warstwy pseudorepozytoriów.
Niemniej jednak, w każdym przypadku, najlepiej EF nie używać.
Mam w bazie danych 2 tabele w relacji wiele do wielu.
Dwie tabele powiązane wiele do wielu. Tabela jest relacją.
I moje pytanie : Czy to wypełnianie ViewModelu np tymi aktorami moge normalnie robić w kontrolerze? Czy powinienem mieć jakąś odzielną warstwę od takiej logiki?
Cały, gotowy ViewModel powinieneś dostać z serwisu aplikacyjnego. W kontrolerach nie powinno być innej logiki niż sprawdzenie, czy operacja się powiodła i przekierowanie do odpowiedniego widoku.