MigracjeMigrations

Migracje umożliwiają przyrostowo Zastosuj zmiany schematu do bazy danych, aby zachować synchronizację z modelem EF Core przy zachowaniu istniejących danych w bazie danych.Migrations provide a way to incrementally apply schema changes to the database to keep it in sync with your EF Core model while preserving existing data in the database.

Tworzenie bazy danychCreating the database

Po wprowadzeniu zdefiniowane początkowej modelu, należy utworzyć bazę danych.After you've defined your initial model, it's time to create the database. Aby to zrobić, należy dodać początkowej migracji.To do this, add an initial migration. Zainstaluj EF podstawowe narzędzia i uruchom odpowiednie polecenie.Install the EF Core Tools and run the appropriate command.

Add-Migration InitialCreate
dotnet ef migrations add InitialCreate

Trzy pliki zostaną dodane do projektu pod migracje katalogu:Three files are added to your project under the Migrations directory:

  • 00000000000000_InitialCreate.cs--pliku głównego migracji.00000000000000_InitialCreate.cs--The main migrations file. Zawiera operacji konieczne jest stosowanie migracji (w Up()) i można go przywrócić (w Down()).Contains the operations necessary to apply the migration (in Up()) and to revert it (in Down()).
  • 00000000000000_InitialCreate.Designer.cs--migracji pliku metadanych.00000000000000_InitialCreate.Designer.cs--The migrations metadata file. Zawiera informacje używane przez EF.Contains information used by EF.
  • MyContextModelSnapshot.cs--migawkę bieżącego modelu.MyContextModelSnapshot.cs--A snapshot of your current model. Używany do określania, jakie zmienione podczas dodawania następnej migracji.Used to determine what changed when adding the next migration.

Sygnatury czasowej w nazwie pliku pomaga zachować uporządkowanych w porządku chronologicznym, zostanie wyświetlony postęp zmiany.The timestamp in the filename helps keep them ordered chronologically so you can see the progression of changes.

Porada

Mogą przenosić pliki migracji i zmienić ich nazw.You are free to move Migrations files and change their namespace. Nowe migracji są tworzone jako elementy równorzędne ostatniej migracji.New migrations are created as siblings of the last migration.

Następnie dotyczą migracji bazy danych można utworzyć schematu.Next, apply the migration to the database to create the schema.

Update-Database
dotnet ef database update

Dodawanie innego migracjiAdding another migration

Po wprowadzeniu zmian w modelu podstawowej EF, schemat bazy danych będzie zsynchronizowany. Aby przywrócić dane, należy dodać innego migracji.After making changes to your EF Core model, the database schema will be out of sync. To bring it up to date, add another migration. Nazwa migracji można jak komunikat zatwierdzenia w systemie kontroli wersji.The migration name can be used like a commit message in a version control system. Na przykład, jeśli wprowadzone zmiany, aby zapisać klienta recenzje produktów, może wybrać przypominać AddProductReviews.For example, if I made changes to save customer reviews of products, I might choose something like AddProductReviews.

Add-Migration AddProductReviews
dotnet ef migrations add AddProductReviews

Po migracji jest szkieletu, możesz poprawność i Dodaj wszelkie dodatkowe operacje wymagane się poprawnie.Once the migration is scaffolded, you should review it for accuracy and add any additional operations required to apply it correctly. Na przykład migracja może zawierać następujące operacje:For example, your migration might contain the following operations:

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

migrationBuilder.AddColumn<string>(
    name: "Name",
    table: "Customer",
    nullable: true);

Gdy te operacje zapewnić zgodność ze schematem bazy danych, nie przechowują nazwy istniejących klientów.While these operations make the database schema compatible, they don't preserve the existing customer names. Aby umożliwić lepsze, przepisać w następujący sposób.To make it better, rewrite it as follows.

migrationBuilder.AddColumn<string>(
    name: "Name",
    table: "Customer",
    nullable: true);

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET Name = FirstName + ' ' + LastName;
");

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

Porada

Dodawanie nowych migracji wyświetli ostrzeżenie, gdy operacja jest szkieletu, która może spowodować utratę danych (takich jak porzucenie kolumny).Adding a new migration warns when an operation is scaffolded that may result in data loss (like dropping a column). Należy przejrzeć szczególnie tych migracje dokładności.Be sure to especially review these migrations for accuracy.

Zastosowanie migracji w bazie danych za pomocą odpowiedniego polecenia.Apply the migration to the database using the appropriate command.

Update-Database
dotnet ef database update

Usuwanie migracjiRemoving a migration

Czasami Dodaj migracji i należy pamiętać, że należy wprowadzać dodatkowych zmian modelu, EF Core przed zastosowaniem.Sometimes you add a migration and realize you need to make additional changes to your EF Core model before applying it. Aby usunąć ostatniego migracji, użyj tego polecenia.To remove the last migration, use this command.

Remove-Migration
dotnet ef migrations remove

Po usunięciu go można wprowadzić zmiany modelu dodatkowe i dodaj go ponownie.After removing it, you can make the additional model changes and add it again.

Powrót do migracjiReverting a migration

Jeśli migracji (lub kilka migracje) już zastosowana do bazy danych, trzeba przywrócić ją, korzystając tego samego polecenia Zastosuj migracje, ale należy określić nazwę migracji, który chcesz przywrócić.If you already applied a migration (or several migrations) to the database but need to revert it, you can use the same command to apply migrations, but specify the name of the migration you want to roll back to.

Update-Database LastGoodMigration
dotnet ef database update LastGoodMigration

Pusty migracjiEmpty migrations

Czasami jest przydatne do dodania do migracji bez wprowadzania żadnych zmian w modelu.Sometimes it's useful to add a migration without making any model changes. W takim przypadku Dodawanie nowych migracji tworzy pusty.In this case, adding a new migration creates an empty one. Można dostosować tej migracji w celu wykonania operacji, które bezpośrednio nie odnoszą się do modelu EF Core.You can customize this migration to perform operations that don't directly relate to the EF Core model. Niektóre elementy, można zarządzać w ten sposób są:Some things you might want to manage this way are:

  • Wyszukiwanie pełnotekstoweFull-Text Search
  • FunkcjeFunctions
  • Procedury składowaneStored procedures
  • WyzwalaczeTriggers
  • WidokiViews
  • itp.etc.

Generowanie skryptu SQLGenerating a SQL script

Podczas debugowania migracji lub ich wdrożeniem w produkcyjnej bazie danych, jest przydatne do generowania skryptu SQL.When debugging your migrations or deploying them to a production database, it's useful to generate a SQL script. Skrypt można następnie można dodatkowo sprawdzone pod kątem dokładności i dopasowane do potrzeb produkcyjną bazę danych.The script can then be further reviewed for accuracy and tuned to fit the needs of a production database. Skryptu można również w połączeniu z technologii wdrażania.The script can also be used in conjunction with a deployment technology. Poniżej przedstawiono podstawowe polecenia.The basic command is as follows.

Script-Migration
dotnet ef migrations script

Dostępnych jest kilka opcji tego polecenia.There are several options to this command.

z migracji należy ostatniej migracji, które są stosowane do bazy danych przed uruchomieniem skryptu.The from migration should be the last migration applied to the database before running the script. Jeśli żadne migracje nie zostały zastosowane, należy określić 0 (jest to wartość domyślna).If no migrations have been applied, specify 0 (this is the default).

Do migracji jest ostatniej migracji, które zostaną zastosowane do bazy danych po uruchomieniu skryptu.The to migration is the last migration that will be applied to the database after running the script. Domyślnie ostatni migracji w projekcie.This defaults to the last migration in your project.

Idempotentności Opcjonalnie można wygenerować skryptów.An idempotent script can optionally be generated. Ten skrypt tylko w przypadku migracji nie zostały jeszcze zastosowane do bazy danych.This script only applies migrations if they haven't already been applied to the database. Jest to przydatne, jeśli nie dokładnie wiadomo, ostatniej migracji stosowane do bazy danych został lub jeśli wdrażasz wiele baz danych, które mogą znajdować się w różnych migracji.This is useful if you don't exactly know what the last migration applied to the database was or if you are deploying to multiple databases that may each be at a different migration.

Stosowanie migracje w czasie wykonywaniaApplying migrations at runtime

Niektóre aplikacje możesz zastosować migracji w środowisku uruchomieniowym podczas uruchamiania lub pierwszego uruchomienia.Some apps may want to apply migrations at runtime during startup or first run. To zrobić przy użyciu Migrate() metody.Do this using the Migrate() method.

Uwaga: Ta metoda nie jest dla wszystkich użytkowników.Caution, this approach isn't for everyone. Mimo że jest doskonałym dla aplikacji z lokalnej bazy danych, większość aplikacji będzie wymagać bardziej niezawodne strategię wdrażania, takie jak Generowanie skryptów SQL.While it's great for apps with a local database, most applications will require more robust deployment strategy like generating SQL scripts.

myDbContext.Database.Migrate();

Ostrzeżenie

Nie wywołuj EnsureCreated() przed Migrate().Don't call EnsureCreated() before Migrate(). EnsureCreated()Pomija migracji, aby utworzyć schemat i spowodować Migrate() się niepowodzeniem.EnsureCreated() bypasses Migrations to create the schema and cause Migrate() to fail.

Uwaga

Ta metoda tworzy nad IMigrator usługi, która może służyć do bardziej zaawansowanych scenariuszy.This method builds on top of the IMigrator service, which can be used for more advanced scenarios. Użyj DbContext.GetService<IMigrator>() do niego dostęp.Use DbContext.GetService<IMigrator>() to access it.