W naszej logice biznesowej czasami mamy zdefiniowane metody, takie jak to:
User.ResetCourse(Course courseToReset)
Problem polega na tym, że zarówno Użytkownik, jak i Kurs są obiektami proxy Entity Framework. Oznacza to, że kiedy trafimy na właściwości nawigacji użytkownika lub kursu, może to spowodować ogromne trafienie w bazie danych, ponieważ obiektów tych nie można poddać IQueryable, więc przechodzi przez nie normalnie.
Aby rozwiązać ten problem, zmieniliśmy podpis na:
User.ResetCourse(MyDBContext db, Course courseToReset)
Oznacza to, że możemy bezpośrednio zapytać bazę danych, aby wprowadzić potrzebne zmiany w efektywny sposób, ale przekazanie kontekstu bazy danych do obiektu biznesowego wydaje się tak błędne.
Później przenieśliśmy do użytkownika warstwę usługi, co oznacza, że mamy coś takiego:
CourseService.ResetForUser(Course courseToReset, User forUser)
Ta usługa zawiera odniesienie do DBContext wprowadzonego podczas tworzenia, ale teraz nasze obiekty biznesowe są tylko workami danych bez zachowania (tj. Model domeny anemicznej).
Jak możemy tego uniknąć?
Odpowiedzi:
Problem polega na tym, że używasz obiektów EF jako obiektów domeny. Obiekty EF są modelami danych, a NIE modelami biznesowymi.
Musisz zadeklarować obiekty biznesowe, które dają Ci swobodę robienia tego, czego potrzebujesz, a następnie pobrać je i przechowywać w repozytorium. Twoje repozytorium zamapuje podmioty EF na podmioty biznesowe. Obiekty EF nigdy nie powinny być używane poza twoimi repozytoriami.
źródło
Prawdopodobnie można tego uniknąć, wykonując coś takiego:
Albo coś w tym rodzaju, jeśli złapiesz mój dryf. Wygląda na to, że podejście, które zastosowałeś w opisanym początkowym sposobie, jest związane z wydajnością i niekoniecznie związane ze strukturą domeny. Naprawdę powinieneś rozważyć rozwiązanie problemu z wydajnością w warstwie usług, ale możesz zachować zachowanie w domenie. Dobrze byłoby wiedzieć, co to znaczy zresetować użytkownika / kurs również w tym kontekście, jeśli chcesz uzyskać lepszą odpowiedź.
źródło
Tradycyjnie jest to rozwiązywane przez zastosowanie strategii pobierania dla każdego przypadku użycia, który instruuje Entity Framework, aby chętnie ładował niezbędne powiązania na początkowe zapytanie za pomocą IQueryable.Include ().
Udi Dahan napisał post, który opisuje ogólne podejście, które można dostosować do Entity Framework.
http://udidahan.com/2007/09/16/fetching-strategy-nhibernate-implementation-available/
źródło