5

Mam dość dużą bazę danych, około 80 tabel lub więcej. Dlatego zdecydowałem się oddzielić tabele w kontekście ograniczonym, zamiast mieć wszystkie 80 tabel w jednym dużym pliku edmx.Czy dodaję tę samą tabelę do kontekstu kontekstowego dla wielu obiektów

więc mam ograniczone konteksty jak sprzedaży, klientów, itp

mam główną tabelę klientów wewnątrz pliku moi klienci edmx. Muszę jednak uzyskać dostęp do pewnych pól, nie wszystkich, ale 1 lub 2 pól (np. Potrzebuję tylko nazwy klienta, zamiast całego obiektu klienta/tabeli) z tabeli klienta z kontekstu edmx sprzedaży.

Czy muszę dodać całą tabelę klientów do pliku edmx sprzedaży? Jaka jest najlepsza praktyka w tym scenariuszu?

Odpowiedz

5

Istnieje kilka problemów leżących u podstaw tego podejścia (IMO):

EF, jak każdy inny ORM, wpada do utrwalania niepokoju. W związku z tym nie powinno to wpływać na sposób struktury twojego modelu domeny. Fakt, że wszystkie twoje istoty trwają w czymś, co brzmi jak jeden magazyn trwałości, może świadczyć o tym, że twoje ograniczone konteksty zachodzą na siebie lub nie istnieją.

Próba przeniesienia się do lepszej struktury nie jest zła :) --- jednak, jak oświadczył Mark Oreta, prawdopodobnie nie zawracałbym sobie głowy strukturą EF.

Podstawowym problemem, z którym się Państwo spotykają, jest próba odczytania z modelu domeny. Wydaje się, że pojawia się to zbyt często w systemach i utrudnia to. Leniwe ładowanie jest bezpośrednim wynikiem tego właśnie. Kiedy czytasz, najlepiej użyj warstwy zapytania z dostępem do magazynu zapytań (może to być ta sama baza danych), która jest zoptymalizowana do czytania. W twoim przykładzie potrzebujesz denormalizowanej nazwy klienta w swojej domenie sprzedaży. W porządku. Próbowanie tego, czytając model domeny, a następnie próbując pobrać dane z modelu domeny w innym ograniczonym kontekście, jest przyczyną bólu.

Jeśli przejdziesz przez dzielenie danych, musisz zachować podział.

Chociaż dane z różnych BC mogą znajdować się w tym samym sklepie, powinieneś pomyśleć o swoich danych tak, jakby każdy BC miał swoją własną bazę danych. Czasami mam pojedynczy projekt z różnymi problemami (warstwy dla niektórych) w różnych folderach/przestrzeni nazw (tutaj .NET). Powinno być możliwe rozdzielenie tych obaw na oddzielne zgromadzenia na podstawie kaprysu. Więc nie powinny być zbyt ściśle powiązane. To samo dotyczy tej struktury danych, którą próbujesz podzielić. Powinieneś zasadniczo móc podzielić odpowiednie dane BC na osobną bazę danych. Mechanizmy uzyskiwania danych przez BC są czymś innym i sądzę, że jeśli nie można tego zająć, może się okazać, że jest ciężko.

Chociaż nie sądzę, że identyfikacja BC od strony danych może być najlepszy pomysł to z pewnością krok w dobrym kierunku :)

+0

Tak więc mówisz, że nie ma znaczenia, czy dodaję klienta do mojego BC sprzedaży, ponieważ jest dobry traktować każdy BC jako osobny magazyn danych? –

+0

Ponadto, gdy mówisz, że potrzebuję denormalizowanej nazwy klienta w mojej domenie sprzedażowej, czy chcesz dodać kolejną kolumnę CustomerName w mojej tablicy sprzedaży? Czy masz na myśli potrzebę dodania cały stół klienta w mojej sprzedaży edmx (BC)? –

+0

Chodzi o to, że jeśli dodasz klienta do swojej domeny sprzedaży, stanie się on VO, ponieważ dostarcza dane (tylko widok) i nie będziesz z nim w ogóle wchodził. Może domena 'Klient' w sprzedaży ma tylko ID i FullName, ale nie" ciągnij "w podmiocie Klienta w domenie sprzedaży. d wybierz denormalizowaną nazwę klienta w swojej domenie sprzedaży. Oczywiście wszystko zależy od kontekstu :) –

2

Jeśli chcesz mieć dostęp do podmiotu klienta z działu sprzedaży za pomocą właściwości nawigacji (Sale.Customer), musisz dodać go do edmx sprzedaży.

Nie jest źle mieć wszystkie tabele w jednym edmx, o ile go tworzysz, używaj go do akcji, które chcesz, a następnie wyrzuć, wykres obiektów nie będzie zdobądź to duże.

Alternatywnie, jeśli chcesz zachować ograniczone konteksty, możesz mieć repozytorium lub coś, co będzie je pobierać po identyfikatorze, gdy będzie to potrzebne.

var customer = customerContext.GetCustomerById(sale.CustomerId); 
8

lubię widok Julie Lerman w tej temacie http://msdn.microsoft.com/en-us/magazine/jj883952.aspx

I użyj ograniczonych kontekstów dla uzyskania dostępu, ponieważ czas ładowania kontekstów jest szybszy, gdy używasz mniejszych elementów dbcontext, nawet przy użyciu wygenerowanych widoków. Prostowanie modelu dostępu jest miłym dodatkiem. Wydajność rozważenia na stronie MS ef: http://msdn.microsoft.com/en-us/data/hh949853

BC pozwalają również na inne korzyści, takie jak ograniczenie dostępu do problemu z zapałkami. Większe problemy pojawiają się, gdy próbujesz pracować z kontekstami db, które różnią się nie tylko tym, w którym DBSet się pojawiają, ale twoimi próbami i zmieniaj widoki modelu. Myślę, że najlepiej zrobić to poza EF i zmapować.

Używam jednego dużego kontekstu SUPERSET do zarządzania tworzeniem/migracją DB. Ale nie codzienny dostęp.

Mniejsze teksty kontekstowe są używane do codziennego dostępu do danych przez cały dzień.

Tak, tak, za wszelką cenę używaj ograniczonych kontekstów. Może to być niezgodne z SAME przechowywania danych. Aby odpowiedzieć na pytanie w brzmieniu "Tak, ta sama tabela (DbSet) może pojawić się w wielu kontekstach:

+0

Jak radzisz sobie z zarządzaniem konfiguracjami encji podczas dodawania tej samej jednostki do wielu kontekstów, szczególnie gdy EF ściąga właściwości nawigacji przez konwencję? Mam więcej informacji na ten temat [tutaj] (http://stackoverflow.com/questions/18486699/entity-configuration-management-with-ddd-bounded-contexts). –

+1

Niestety, jeśli właściwość 'ignore' lub tabela jest niewystarczająca, a użytkownik chce mieć różne opcje nawigacji w tych samych tabelach, będzie potrzebował NO klasy podstawowej. Klasa 1: baza z dodanym NVA i class2 bez Nav. Ten aspekt jest bolesny, ale nieunikniony, jeśli masz ten konkretny wymóg. –

Powiązane problemy