2015-08-27 9 views
5

Korzystam z bazy danych Database First Entity Framework (EDMX) i projektów bazy danych SQL Server w bardzo udany sposób - zmień schemat w bazie danych i "Zaktualizuj model z bazy danych ", aby wprowadzić je do EDMX. Widzę jednak, że Entity Framework 7 zrzuci format EDMX i szukam nowego procesu, który pozwoli mi używać Code First w połączeniu z projektami baz danych.Proces rozwoju dla Code First Entity Framework i SQL Server Data Tools Projekty bazy danych

Wiele moich obecnych procesów programowania i wdrażania opiera się na posiadaniu projektu bazy danych, który zawiera schemat. Ta funkcja kontroli źródła jest wdrażana wraz z kodem i służy do aktualizacji produkcyjnej bazy danych wraz z migracją danych za pomocą skryptów przed i po wdrożeniu. Byłbym niechętny, aby go upuścić.

Chciałbym podzielić jeden duży EDMX na wiele mniejszych modeli w ramach tej pracy. Będzie to oznaczać wiele modeli Code First odnoszących się do tej samej bazy danych.

Zakładając, że mam istniejącą bazę danych i projekt bazy danych, który się z tym wiąże - myślę, że zacznę od użycia następującego kreatora, aby utworzyć początkowy zestaw encji i klas kontekstu - zrobiłbym to dla każdego z modele.

Add | New Item... | Visual C# Items | Data | ADO.NET Entity Data Model | Code first from database 

Mój problem polega na tym, dokąd się udać? Jak obsługiwać zmiany schematu? Tak długo, jak mogę uzyskać zaktualizowany schemat bazy danych, mogę użyć operacji porównywania schematu, aby uzyskać zmiany w projekcie.

Oto opcje, które rozważam.

  1. Dokonaj zmian w bazie danych i użyj kreatora od góry, aby się zregenerować. Sądzę, że będę musiał zachować wszelkie modyfikacje encji i/lub klas kontekstu w klasach częściowych, aby nie zostały nadpisane. Automatyzacja tego z listą tabel itp., Które należy uwzględnić, byłaby przydatna. Może szablony Powershell lub T4? SqlSharpener (sugerowane przez Keitha w komentarzach) wygląda na to, że może pomóc tutaj. Chciałbym również spojrzeć na disabling all but the checks for database existence and schema compatibility tutaj, jak sugeruje Steve Green w komentarzach.
  2. Wprowadź zmiany w kodzie i używaj migracji, aby zastosować te zmiany do bazy danych. Z tego co rozumiem, niepoprawne mapowanie map do schematów bazy danych (moje nie) może stwarzać problemy. Widzę również kilka skarg na sieci, że migracje nie obejmują wszystkich typów obiektów bazy danych - to było również moje doświadczenie, gdy bawiłem się z Code First jakiś czas temu - unikalne ograniczenia, które moim zdaniem nie zostały uwzględnione. Czy to się poprawiło w Entity Framework 7?
  3. Wprowadź zmiany w bazie danych, a następnie użyj migracji jako pewnego rodzaju porównania kodu z bazą danych. Zobacz, jakie są różnice i dostosuj odpowiedni kod. Kontynuuj, aż nie będzie żadnych różnic.
  4. Dokonuj zmian ręcznie w kodzie i bazie danych. Oczywiście nie jest to zbyt atrakcyjne.

Który z nich byłby najlepszy? Czy jest coś, co powinienem wiedzieć przed próbą wdrożenia? Czy są jakieś inne, lepsze opcje?

+1

Jeśli przejdziesz na trasę bez migracji, możesz przynajmniej zastosować czek przy starcie, aby upewnić się, że jesteś zsynchronizowany. https://coding.abel.nu/2012/03/prevent-ef-migrations-crom-creating-lub-changing-the-database/ –

+2

Rozważ [SqlSharpener] (https://github.com/aeslinger0/sqlsharpener) aby ci pomóc z opcją # 1. – Keith

+0

Dzięki @SteveGreene. To naprawdę brzmi, jakby to było warte zachodu. Dodałem Twoją sugestię do punktu 1. –

Odpowiedz

3

Tak więc, ścieżką, którą wybraliśmy było stworzenie niektórych szablonów T4, które generują zarówno DbContext jak i nasze jednostki. Dostarczamy jednostce T4 listę tabel, z których należy generować encje i składni wskazującej, że jednostka oparta na jednej tabeli powinna dziedziczyć z jednostki na podstawie innej. Kod niestandardowy przechodzi w klasy częściowe. Nasze rozwiązanie wygląda jak moja opcja 1 z góry.

Rozpoczęliśmy także generowanie płynnej konfiguracji w OnModelCreating w DbContext, ale zamieniliśmy ją na używanie atrybutów na Entities (tam, gdzie istnieją atrybuty - HasPrecision było tym, do którego musieliśmy użyć płynnej konfiguracji). Okazało się, że jest to bardziej zwięzłe i łatwiejsze do znalezienia konfiguracji dla nieruchomości, gdy jest to właśnie dekorowanie tej właściwości.

+2

Dzięki Scott. Warto zobaczyć, jak inni radzą sobie z takimi sytuacjami i jak radzą sobie z obawami zgłaszanymi przez aplikacje w świecie rzeczywistym. – user1843640

Powiązane problemy