Migrationen
Migrationen bieten eine Möglichkeit, Schemaänderungen schrittweise auf die Datenbank anzuwenden, um sie mit Ihrem EF Core-Modell zu synchronisieren und gleichzeitig vorhandene Daten in der Datenbank beizubehalten.
- Wenn Sie mit der Entwicklung Ihrer Anwendungen beginnen, werden Sie höchstwahrscheinlich Änderungen in Ihrem Modell mit geänderten Anforderungen sehen.
- Wenn sich ein Modell ändert, müssen wir die Datenbank mit dem Modell synchron halten.
- Mit der Migrationsfunktion können Sie Änderungen an Ihrem Modell vornehmen und diese Änderungen anschließend an Ihr Datenbankschema weitergeben.
Nehmen wir an, wir haben ein einfaches Modell mit drei Entitäten.
public class Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public virtual List<Invoice> Invoices { get; set; }
}
public class Invoice
{
public int Id { get; set; }
public DateTime Date { get; set; }
public int CustomerId { get; set; }
[ForeignKey("CustomerId")]
public virtual Customer Customer { get; set; }
public virtual List<InvoiceItem> Items { get; set; }
}
public class InvoiceItem
{
public int InvoiceItemId { get; set; }
public int InvoiceId { get; set; }
public string Code { get; set; }
[ForeignKey("InvoiceId")]
public virtual Invoice Invoice { get; set; }
}
Hier ist die Kontextklasse.
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Invoice> Invoices { get; set; }
public DbSet<InvoiceItem> InvoiceItems { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=CustomerDB;");
}
}
Migration hinzufügen
Sie können die Migration zum Erstellen einer ursprünglichen Datenbank verwenden, indem Sie in der Package Manager Console einen ersten Migrationsbefehl hinzufügen.
PM> Add-Migration InitialCreate
InitialCreate ist der Migrationsname und es liegt an Ihnen, was Sie als Namen angeben möchten.
Die ersten Migrationsbefehle fügen drei Dateien zu Ihrem Projekt unter dem Ordner Migrations hinzu.
- _InitialCreate.cs: Dies ist die Hauptmigrationsdatei, in der die Vorgänge ausgeführt werden müssen, um die Migration in der
Up()
Methode anzuwenden und sie auf dieDown()
Methode zurückzusetzen. - _InitialCreate.Designer.cs: Dies ist eine Migrationsmetadatendatei, die Informationen enthält, die von EF verwendet werden.
- MyContextModelSnapshot.cs: Dies ist die Momentaufnahme Ihres Modells, anhand der festgestellt wurde, welche Änderungen beim Hinzufügen der nächsten Migration vorgenommen wurden.
Führen Sie den folgenden Befehl aus, um die Migration auf die Datenbank anzuwenden, um das Schema zu erstellen.
PM> Update-Database
Sie können diese Datenbank mit drei Tabellen erstellen.
Fügen Sie eine weitere Migration hinzu
Angenommen, Sie möchten der Entität Customer eine PhoneNumber-Eigenschaft hinzufügen.
public class Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string PhoneNumber { get; set; }
public virtual List<Invoice> Invoices { get; set; }
}
Nachdem Sie Änderungen an Ihrem EF Core-Modell vorgenommen haben, ist das Datenbankschema nicht mehr synchron. Um es auf den neuesten Stand zu bringen, müssen Sie eine weitere Migration hinzufügen, indem Sie den Befehl Add-Migration
und diese Migration als AddPhoneNumber aufrufen .
PM> Add-Migration AddPhoneNumber
Ihre Migrationsdatei wird so aussehen.
public partial class AddPhoneNumber : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "PhoneNumber",
table: "Customers",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PhoneNumber",
table: "Customers");
}
}
Wenden Sie die Migration mit dem folgenden Befehl an die Datenbank an.
PM> Update-Database
Entfernen Sie die Migration
Manchmal fügen Sie eine Migration hinzu und erkennen, dass Sie vor der Anwendung weitere Änderungen an Ihrem EF Core-Modell vornehmen müssen. Um die letzte Migration zu entfernen, können Sie den folgenden Befehl verwenden.
PM> Remove-Migration
Migration rückgängig machen
Wenn Sie bereits mehrere Migrationen auf die Datenbank angewendet haben, diese jedoch zurücksetzen müssen, können Sie den Befehl Update-Database
aber auch den Namen der Migration angeben, auf die ein Rollback ausgeführt werden soll.
PM> Update-Database LastGoodMigration