5

Gram z Entity Framework Core i pracuję nad implementacją aplikacji Database-First. Początkowe polecenie Scaffold-DbContext działa dobrze i poprawnie tworzy wszystkie moje jednostki, jeśli nie jest zorganizowane tak, jak bym chciał. Jest to baza danych SQL Server, która używa schematów w celu rozbicia obszarów odpowiedzialności i nie obchodzi mnie fakt, że rusztowanie rzuca je wszystkie do jednego folderu.Podstawowa baza danych jednostki Entity - pierwsza aktualizacja po początkowym rusztowaniu?

Poza tym nie udało mi się ustalić, czy istnieje sposób na ponowne uruchomienie rusztowania w celu aktualizacji klas po aktualizacji bazy danych. Najbliższym, co mogę znaleźć, jest ponowne uruchomienie polecenia Scaffold-DbContext za pomocą parametru -force. Jednak to również zastępuje dowolny niestandardowy kod dodany do pliku Context.cs, np. Wskazuje ciąg połączenia na wartość konfiguracyjną zamiast twardego kodowania.

Spojrzałem na kilka innych pytań podobnych do this one, ale to tylko mówi o początkowym rusztowaniu, a nie o dalszych aktualizacjach.

Czy istnieje sposób na ręczne kodowanie jakichkolwiek przyszłych zmian, aby to zrobić? Bez tego wydaje się, że podejście oparte na bazie danych jest absolutnie bezwartościowe w przypadku EF Core.

+0

za komentarz schematu może chcesz spróbować coś takiego gdzie „integracja” to nazwa schematu: DotNet ef dbcontext scaffold "" Microsoft.EntityFrameworkCore.SqlServer -c "IntegrationContext" --schema "integration" -f –

Odpowiedz

3

Tak jak powiedziałeś sam ... Główny problem z pierwszym podejściem do bazy danych: Nigdy nie powinieneś ręcznie zmieniać modelu i zacząć zmieniać nazwy itp. Z wyjątkiem sytuacji, gdy masz 100% pewności, że twoja baza danych już się nie zmieni. Jeśli nie jesteś w 100% pewny, po prostu wpisz kod z modelem, który został wygenerowany automatycznie.

Nigdy nie dotykaj modelu, w ten sposób przynajmniej to, co pozostaje w bazie danych, pozostanie niezmienione w modelu. To, co się zmieniło ... również zmieni ten model.

Ale można dokonać częściowych klas, które nie zostaną nadpisane przez auto mapowanie:

public partial class TableName 
{ 
    public string Name_of_a_property 
    {get; set;} 
} 

Jest to miły mały sposób na dodanie kodu do swojej jednostki, będąc pewna, że ​​nie zostanie dotknięty przez auto- mapowanie.

+1

Oczywiście, ponieważ jest to poniedziałek, klasy częściowe nie weszły mi do głowy. Opuściłem EF po użyciu EF5 przez jakiś czas. Całkowicie zapomniałem o tym podejściu. To zadziała. Muszę tylko pamiętać o ponownym rusztowaniu po każdej aktualizacji bazy danych. – BBlake

+0

Nie rozumiem, jak to pomaga. Wierzę ci. Po prostu nie wiem jak to zrobić. Kiedy najpierw generuję moje klasy z bazy danych, kiedy mam zrobić klasę częściową i gdzie? Następnie przerobić? – johnny

+0

@johnny Możesz po prostu dodać nową klasę do swojego projektu i, o dziwo, nazywając klasę częściową nazwę SAME, tak jak twój stół sprawi, że zobaczą się nawzajem, możesz użyć dodatkowych funkcji zakodowanych w klasie częściowej. Podczas gdy klasa tabeli może zmieniać się na ponownym rusztowaniu, nigdy nie będzie klasy częściowej. Koduj tyle, ile chcesz w klasach częściowych, a nie bezpośrednio w klasach modeli. Dotyczy to najpierw DB.(mam nadzieję, że to będzie lepsze uczucie) –

1

Rusztowanie z możliwością ponownego użycia może być używane jako prawdziwe DB Pierwsze podejście jako answered by Antoine Pelletier.

Jednak częściej używane jest rusztowanie po w celu początkowego importu modelu do kodu, a następnie kontynuowania podejścia Code First. Proces Zastosowanie inżynierii odwrotnej do stworzenia modelu Entity Framework na podstawie istniejącej bazy opisaną w https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db

+0

Tak, ale z pewnością wydaje się powodować (mi) wiele bólów głowy, kiedy to robię. Miałem te same myśli, ale w mojej praktyce robi się to trudne, ponieważ muszę iść i zacząć bawić się z context.cs, jak również z generowanymi przeze mnie klasami. Powiedz, jeśli dodaję klucz obcy lub coś takiego. – johnny

+0

@johnny, Code Po pierwsze zakłada się, że klasy kontekstu i encji nie są generowane, ale jako model główny. Twoje zmiany zostaną wprowadzone w kodzie, a następnie zastosować do bazy danych za pomocą migracji. Jednak zgadzam się, że czasami może to być trudne. Możesz uruchomić skrypty osadzone dla niektórych zmian sql, takich jak dodanie dodatkowych indeksów –