Kod-pierwszy vs Model / baza danych-pierwszy

Jakie są zalety i wady korzystania z kodu Entity Framework 4.1-najpierw nad modelem / Bazą Danych - najpierw z diagramem EDMX?

Staram się w pełni zrozumieć wszystkie podejścia do budowania warstwy dostępu do danych przy użyciu EF 4.1. Używam repozytorium pattern i IoC.

Wiem, że mogę używać podejścia opartego na kodzie: definiować moje encje i kontekst ręcznie i używać ModelBuilder, aby dostroić schemat.

Mogę również utworzyć diagram EDMX i wybrać krok generowania kodu, który używa T4 szablony do generowania tych samych klas POCO.

W obu przypadkach kończę z POCO obiektem, który jest ORM agnostykiem i kontekstem, który wywodzi się z DbContext.

Database-first wydaje się być najbardziej atrakcyjne, ponieważ mogę zaprojektować bazę danych w Enterprise Manager, szybko zsynchronizować model i dostroić go za pomocą projektanta.

Więc jaka jest różnica między tymi dwoma podejściami? Czy chodzi tylko o preferencje VS2010 vs Enterprise Manager?
Author: Romias, 2011-03-27

9 answers

Myślę, że różnice są następujące:

Kod pierwszy

  • bardzo popularne, ponieważ zapaleni programiści nie lubią żadnych projektantów i definiowanie mapowania w EDMX xml jest zbyt skomplikowane.
  • Pełna kontrola nad kodem (brak autogeneracyjnego kodu, który jest trudny do modyfikacji).
  • ogólne oczekiwanie polega na tym, że nie przejmujesz się DB. DB to tylko pamięć masowa bez logiki. EF zajmie się tworzeniem i nie chcesz wiedzieć, jak to robi.
  • ręczne zmiany w baza danych zostanie najprawdopodobniej utracona, ponieważ kod definiuje bazę danych.

Baza danych pierwsza

  • bardzo popularne, jeśli masz DB zaprojektowane przez DBAs, opracowane osobno lub jeśli masz istniejący DB.
  • pozwolisz EF tworzyć encje dla Ciebie, a po modyfikacji mapowania wygenerujesz encje POCO.
  • Jeśli chcesz mieć dodatkowe funkcje w encjach POCO, musisz zmodyfikować szablon T4 lub użyć klas częściowych.
  • ręczne zmiany w bazy danych są możliwe, ponieważ baza danych definiuje model domeny. Zawsze możesz zaktualizować model z bazy danych (Ta funkcja działa całkiem dobrze).
  • często używam tego razem VS projekty Baz Danych (tylko Wersja Premium i Ultimate).

Model pierwszy

  • IMHO popularne jeśli jesteś fanem designera (=nie lubisz pisać kodu lub SQL).
  • "narysujesz" swój model i pozwolisz workflow wygenerować skrypt bazy danych, a szablon T4 wygeneruje Twoje POCO / align = "left" / Stracisz część kontroli zarówno nad podmiotami, jak i bazą danych, ale w przypadku małych łatwych projektów będziesz bardzo produktywny.
  • Jeśli chcesz mieć dodatkowe funkcje w encjach POCO, musisz zmodyfikować szablon T4 lub użyć klas częściowych.
  • ręczne zmiany w bazie danych zostaną najprawdopodobniej utracone, ponieważ model definiuje bazę danych. Działa to lepiej, jeśli masz zainstalowany zasilacz do generowania bazy danych. Pozwoli na aktualizację schematu bazy danych (zamiast odtwarzania) lub aktualizowanie projektów baz danych w VS.

Spodziewam się, że w przypadku EF 4.1 istnieje kilka innych funkcji związanych najpierw z kodem, a potem z Modelem/bazą danych. Fluent API używane w kodzie First nie oferuje wszystkich funkcji EDMX. Oczekuję, że funkcje takie jak mapowanie procedur składowanych, widoki zapytań, definiowanie widoków itp. działa przy pierwszym użyciu modelu / bazy danych i DbContext (jeszcze nie próbowałem), ale nie w kodzie.

 647
Author: Ladislav Mrnka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 00:58:40

Myślę, że to proste "drzewo decyzyjne" autorstwa Julie Lerman, autorki "Programming Entity Framework", powinno pomóc w podjęciu decyzji z większą pewnością:

drzewo decyzyjne ułatwiające wybór różnych podejść z EF

Więcej informacji Tutaj .

 123
Author: Bahador Izadpanah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 09:03:18

Baza danych first i model first nie mają rzeczywistych różnic. Wygenerowany kod są takie same i można połączyć to podejście. Na przykład możesz utworzyć bazę danych za pomocą designera, a następnie zmienić bazę danych za pomocą skryptu sql i zaktualizować swój model.

Przy pierwszym użyciu kodu nie można zmienić modelu bez odtworzenia bazy danych i utraty wszystkich danych. IMHO, to ograniczenie jest bardzo surowe i nie pozwala na użycie kodu najpierw w produkcji. Na razie nie nadaje się do użytku.

Drugi drobną wadą kodu jest to, że model builder wymaga uprawnień na głównej bazie danych. Nie ma to wpływu na Ciebie, jeśli używasz SQL Server Compact database lub jeśli kontrolujesz serwer bazy danych.

Zaletą kodu jest przede wszystkim bardzo czysty i prosty kod. Masz pełną kontrolę nad tym kodem i możesz go łatwo modyfikować i używać jako modelu widoku.

Mogę polecić użycie kodu jako pierwszego podejścia podczas tworzenia prostej samodzielnej aplikacji bez wersjonowania i korzystania z modelu \ bazy danych pierwszy w projektach, które wymagają modyfikacji w produkcji.

 44
Author: Stepan Smagin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 10:14:02

Cytowanie odpowiednich części z http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-framework

3 powody, dla których warto używać kodu jako pierwszego projektu z Entity Framework

1) Less cruft, less wzdęcia

Wykorzystanie istniejącej bazy danych do wygenerowaniaplik modelu edmx i powiązane modele kodu skutkują gigantyczną stertą automatycznie wygenerowanego kodu. Jesteś błagany, aby nigdy nie dotykać tych wygenerowanych plików, aby nie złamać coś, albo twoje zmiany zostaną nadpisane na następnym pokoleniu. Na context i initializer są również połączone w tym bałaganie. Kiedy musisz dodać funkcjonalność do generowanych modeli, takich jak obliczona właściwość tylko do odczytu, należy rozszerzyć klasę modelu. Kończy się to wymogiem dla prawie każdego modelu i kończy się z przedłużeniem na wszystko.

Z kodem najpierw Twoje ręcznie kodowane modele stają się Twoją bazą danych. Dokładnie / align = "left" / budynek jest tym, co generuje projekt bazy danych. Nie ma dodatkowych plików i nie ma potrzeby tworzenia klasy rozszerzenie, gdy chcesz dodać właściwości lub cokolwiek innego, że baza danych nie musi o tym wiedzieć. Możesz je po prostu dodać do ta sama klasa, o ile stosujesz właściwą składnię. Heck, you can even Wygeneruj Model.plik edmx do wizualizacji kodu, jeśli chcesz.

2) Większa Kontrola

When you go DB first, you ' re at the mercy z tego, co jest generowane dla twoje modele do wykorzystania w Twojej aplikacji. Okazjonalnie nazewnictwo konwencja jest niepożądana. Czasami relacje i skojarzenia nie są tym, czego chcesz. Inne czasy Nie przemijające relacje z leniwym ładowaniem sieją spustoszenie w odpowiedziach API.

Podczas gdy prawie zawsze jest rozwiązanie problemów z generowaniem modeli możesz wpaść, idąc najpierw kod daje kompletne i dobrze grained control from the get go. Możesz kontrolować każdy aspekt obu twoje modele kodu i projektowanie baz danych z komfortu Twojej obiekt biznesowy. Można precyzyjnie określić relacje, ograniczenia, i stowarzyszenia. Można jednocześnie ustawić limity znaków właściwości i wielkości kolumn bazy danych. Możesz określić, które powiązane Kolekcje mają być chętnie załadowane, lub nie być serializowane w ogóle. Krótko mówiąc, jesteś odpowiedzialny za więcej rzeczy, ale masz pełną kontrolę nad aplikacją design.

3)Wersja Bazy Danych Kontrola

To jest duże. Wersjonowanie baz danych jest trudne, ale z kodem najpierw i pierwsze migracje kodu, jest to o wiele bardziej skuteczne. Ponieważ twój schemat bazy danych jest w pełni oparty na modelach kodu, według wersji kontrolowanie kodu źródłowego pomagasz w wersji bazy danych. Jesteś odpowiedzialny za kontrolowanie inicjalizacji kontekstu, który może pomóc w robieniu takich rzeczy, jak stałe dane biznesowe seed. Jesteś też odpowiedzialny za tworzenie pierwszych migracji kodu.

Kiedy po raz pierwszy włączysz migracje, Klasa konfiguracji i początkowy generowane są migracje. Początkowa migracja jest twoim obecnym schematem lub twój baseline v1. 0. Od tego momentu dodasz migracje które są oznaczone czasowo i oznaczone deskryptorem, aby pomóc w zamawianie wersji. Po wywołaniu add-migration z pakietu Menedżerze, zostanie wygenerowany nowy plik migracji zawierający wszystko który zmienił się w modelu kodu automatycznie zarówno w górę() oraz Funkcja DOWN (). Funkcja UP stosuje zmiany do bazy danych, funkcja DOWN usuwa te same zmiany w przypadku, gdy chcesz wycofujemy się. Co więcej, możesz edytować te pliki migracji, aby dodać dodatkowe zmiany, takie jak nowe widoki, indeksy, procedury składowane i cokolwiek jeszcze. Staną się prawdziwym systemem wersjonowania dla Twojego schemat bazy danych.

 28
Author: Jahan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 19:59:50

Kod - najpierw pojawia się wschodząca gwiazda. Rzuciłem okiem na Ruby on Rails, a ich standardem jest code-first, z migracjami baz danych.

Jeśli budujesz aplikację MVC3, wierzę, że kod najpierw ma następujące zalety:

  • Easy attribute decoration - możesz ozdobić pola z walidacją, wymaganiem itp.. atrybuty, jest to dość niezręczne z modelowaniem EF
  • Brak dziwnych błędów modelowania - modelowanie EF często ma dziwne błędy, na przykład, gdy próbujesz zmienić nazwę właściwości asocjacyjnej, musi ona pasować do podstawowych metadanych-bardzo nieelastyczne.
  • nie jest kłopotliwe łączenie - przy użyciu narzędzi kontroli wersji kodu, takich jak mercurial, merging .pliki edmx to ból. Jesteś programistą przyzwyczajonym do C#, a tam łączysz a .edmx. Nie tak z kodem-najpierw.
  • Wróć najpierw do kodu i masz pełną kontrolę bez wszystkich ukrytych zawiłości i niewiadomych do czynienia.
  • polecam użyj narzędzia wiersza poleceń menedżera pakietów, nie używaj nawet narzędzi graficznych, aby dodać nowy kontroler do widoków rusztowania.
  • DB-Migrations - wtedy można również włączyć-migracje. To jest takie potężne. Możesz wprowadzić zmiany w swoim modelu w kodzie, a następnie framework może śledzić zmiany schematu, dzięki czemu można bezproblemowo wdrażać Uaktualnienia, a wersje schematu są automatycznie uaktualniane (i obniżane w razie potrzeby). (Nie jestem pewien, ale to chyba działa z modelem-najpierw too)

Update

Pytanie wymaga również porównania code-first do modelu EDMX / db-first. Kod-first może być również użyty dla obu tych podejść:

 26
Author: Todd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-15 23:33:30

Najpierw używam bazy danych EF, aby zapewnić większą elastyczność i kontrolę nad konfiguracją bazy danych.

EF code first i model first wydawało się fajne na początku, i zapewnia niezależność bazy danych, jednak w ten sposób nie pozwala na określenie, co uważam za bardzo podstawowe i powszechne informacje o konfiguracji bazy danych. Na przykład indeksy tabel, metadane zabezpieczeń lub klucz podstawowy zawierający więcej niż jedną kolumnę. I find I want to use these and other common database funkcje i dlatego też trzeba zrobić jakąś konfigurację bazy danych bezpośrednio i tak.

Domyślne klasy poco generowane w DB first są bardzo czyste, jednak brakuje bardzo użytecznych atrybutów adnotacji danych lub mapowania do procedur składowanych. Użyłem szablonów T4, aby przezwyciężyć niektóre z tych ograniczeń. Szablony T4 są niesamowite, zwłaszcza w połączeniu z własnymi metadanymi i częściowymi klasami.

Model pierwszy wydaje się mieć duży potencjał, ale daje mi wiele błędy podczas refaktoryzacji złożonego schematu bazy danych. Nie wiem dlaczego.

 11
Author: user1618371,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 04:16:04

Praca z dużymi modelami była bardzo powolna przed SP1, (nie próbowałem tego po SP1, ale mówi się, że jest teraz szybki).

Nadal najpierw projektuję moje tabele, a następnie własne narzędzie generuje POCOs dla mnie, więc bierze na siebie ciężar wykonywania powtarzalnych zadań dla każdego obiektu poco.

Kiedy używasz systemów kontroli źródeł, możesz łatwo śledzić historię swojego POCOs, nie jest to takie proste z kodem generowanym przez projektanta.

Mam bazę dla mojego POCO, co ułatwia wiele spraw.

Mam widoki dla wszystkich moich tabel, każdy widok bazowy przynosi podstawowe informacje dla moich kluczy zagranicznych, a mój widok POCOs pochodzi z moich klas POCO, co jest dość przydatne ponownie.

I w końcu nie lubię projektantów.

 6
Author: hazimdikenli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-01 07:44:09

Przykład pierwszego podejścia do bazy danych:

Bez pisania kodu: ASP.NET MVC / MVC3 Database First Approach / Database first

I myślę, że jest to lepsze niż inne podejścia, ponieważ utrata danych jest mniejsza z tym podejściem.

 4
Author: AukI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 03:33:30

IMHO myślę, że wszystkie modele mają świetne miejsce, ale problem, który mam z pierwszym podejściem modelu jest w wielu dużych firmach z kontrolowaniem baz danych przez DBA Nie uzyskujesz elastyczności budowania aplikacji bez korzystania z pierwszych podejść bazodanowych. Pracowałem nad wieloma projektami i jeśli chodzi o wdrożenie, chcieli pełnej kontroli.

Więc jak bardzo Zgadzam się ze wszystkimi możliwymi wariacjami Kod najpierw, Model najpierw, baza najpierw, musisz wziąć pod uwagę rzeczywiste środowisko produkcyjne. Więc jeśli Twój system ma być duża aplikacja bazy użytkowników z wielu użytkowników i dba działa show następnie można rozważyć pierwszą opcję bazy danych tylko moja opinia.

 3
Author: Matthew Parton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-23 15:28:58