Entity Framework
Erste Migrationen für Entity-Framework-Code
Suche…
Migrationen aktivieren
Verwenden Sie den Befehl, um Code First Migrations im Entity Framework zu aktivieren
Enable-Migrations
in der Package Manager Console .
Sie benötigen eine gültige DbContext
Implementierung, die Ihre von EF verwalteten Datenbankobjekte enthält. In diesem Beispiel enthält der Datenbankkontext die Objekte BlogPost
und Author
:
internal class DatabaseContext: DbContext
{
public DbSet<Author> Authors { get; set; }
public DbSet<BlogPost> BlogPosts { get; set; }
}
Nach der Ausführung des Befehls sollte die folgende Ausgabe erscheinen:
PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>
Darüber hinaus sollte ein neuer Ordner Migrations
mit einer einzigen Datei Configuration.cs
angezeigt werden:
Der nächste Schritt wäre das Erstellen des ersten Datenbankmigrationsskripts, das die ursprüngliche Datenbank erstellt (siehe nächstes Beispiel).
Fügen Sie Ihre erste Migration hinzu
Nachdem Sie Migrationen aktiviert haben (siehe dieses Beispiel ), können Sie jetzt Ihre erste Migration mit einer ersten Erstellung aller Datenbanktabellen, Indizes und Verbindungen erstellen.
Mit dem Befehl kann eine Migration erstellt werden
Add-Migration <migration-name>
Dieser Befehl erstellt eine neue Klasse mit zwei Methoden Up
und Down
, die zum Anwenden und Entfernen der Migration verwendet werden.
Wenden Sie nun den Befehl gemäß dem obigen Beispiel an, um eine Migration mit dem Namen Initial zu erstellen:
PM> Add-Migration Initial
Scaffolding migration 'Initial'.
The Designer Code for this migration file includes a snapshot of your current Code
First model. This snapshot is used to calculate the changes to your model when you
scaffold the next migration. If you make additional changes to your model that you
want to include in this migration, then you can re-scaffold it by running
'Add-Migration Initial' again.
Eine neue Datei timestamp _Initial.cs wird erstellt (hier werden nur die wichtigsten Elemente angezeigt):
public override void Up()
{
CreateTable(
"dbo.Authors",
c => new
{
AuthorId = c.Int(nullable: false, identity: true),
Name = c.String(maxLength: 128),
})
.PrimaryKey(t => t.AuthorId);
CreateTable(
"dbo.BlogPosts",
c => new
{
Id = c.Int(nullable: false, identity: true),
Title = c.String(nullable: false, maxLength: 128),
Message = c.String(),
Author_AuthorId = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Authors", t => t.Author_AuthorId)
.Index(t => t.Author_AuthorId);
}
public override void Down()
{
DropForeignKey("dbo.BlogPosts", "Author_AuthorId", "dbo.Authors");
DropIndex("dbo.BlogPosts", new[] { "Author_AuthorId" });
DropTable("dbo.BlogPosts");
DropTable("dbo.Authors");
}
Wie Sie sehen, werden in der Methode Up()
zwei Tabellen Authors
und BlogPosts
erstellt, und die Felder werden entsprechend erstellt. Außerdem wird die Beziehung zwischen den beiden Tabellen erstellt, indem das Feld Author_AuthorId
. Auf der anderen Seite versucht die Methode Down()
, die Migrationsaktivitäten umzukehren.
Wenn Sie mit Ihrer Migration vertraut sind, können Sie die Migration mit dem Befehl auf die Datenbank anwenden:
Update-Database
Alle anstehenden Migrationen (in diesem Fall der Anfangs -Migration) werden in die Datenbank übernommen und danach die Samen Methode angewendet wird (das entsprechende Beispiel)
PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target
database.
Applying explicit migrations: [201609302203541_Initial].
Applying explicit migration: 201609302203541_Initial.
Running Seed method.
Sie können die Ergebnisse der Aktivitäten im SQL-Explorer sehen:
Für die Befehle Add-Migration
und Update-Database
verschiedene Optionen zur Verfügung, mit denen die Aktivitäten angepasst werden können. Um alle Optionen anzuzeigen, verwenden Sie bitte
get-help Add-Migration
und
get-help Update-Database
Daten während Migrationen suchen
Nach dem Aktivieren und Erstellen von Migrationen müssen Sie möglicherweise zunächst Daten in Ihrer Datenbank füllen oder migrieren. Es gibt mehrere Möglichkeiten, aber für einfache Migrationen können Sie die Methode 'Seed ()' in der Datei Configuration verwenden, die nach dem Aufruf von enable-migrations
.
Die Seed()
Funktion ruft einen Datenbankkontext als einzigen Parameter ab und Sie können EF-Operationen innerhalb dieser Funktion ausführen:
protected override void Seed(Model.DatabaseContext context);
Sie können alle Arten von Aktivitäten in Seed()
ausführen. Im Falle eines Fehlers wird die vollständige Transaktion (auch die angewendeten Patches) zurückgesetzt.
Eine Beispielfunktion, die nur Daten erstellt, wenn eine Tabelle leer ist, könnte folgendermaßen aussehen:
protected override void Seed(Model.DatabaseContext context)
{
if (!context.Customers.Any()) {
Customer c = new Customer{ Id = 1, Name = "Demo" };
context.Customers.Add(c);
context.SaveData();
}
}
Eine nette Funktion der EF-Entwickler ist die Erweiterungsmethode AddOrUpdate()
. Diese Methode ermöglicht das Aktualisieren von Daten basierend auf dem Primärschlüssel oder das Einfügen von Daten, falls diese noch nicht vorhanden sind (das Beispiel stammt aus dem generierten Quellcode von Configuration.cs):
protected override void Seed(Model.DatabaseContext context)
{
context.People.AddOrUpdate(
p => p.FullName,
new Person { FullName = "Andrew Peters" },
new Person { FullName = "Brice Lambson" },
new Person { FullName = "Rowan Miller" }
);
}
Bitte beachten Sie, dass
Seed()
aufgerufen wird, nachdem der letzte Patch angewendet wurde. Wenn Sie während der Patches Daten migrieren oder überarbeiten müssen, müssen andere Ansätze verwendet werden.
Verwenden von SQL () während Migrationen
Beispiel: Sie migrieren eine vorhandene Spalte von nicht erforderlich zu erforderlich. In diesem Fall müssen Sie möglicherweise einige Standardwerte in der Migration für Zeilen eingeben, bei denen die geänderten Felder tatsächlich NULL
. defaultSql
der Standardwert einfach ist (z. B. "0"), können Sie in Ihrer defaultSql
eine default
oder defaultSql
Eigenschaft verwenden. Falls es nicht so einfach ist, können Sie die Sql()
Funktion in den Up()
oder Down()
Sql()
Ihrer Migrationen verwenden.
Hier ist ein Beispiel. Annahme einer Klasse Autor, der eine E-Mail-Adresse als Teil des Datensatzes enthält. Jetzt entscheiden wir uns, die E-Mail-Adresse als Pflichtfeld zu verwenden. Um vorhandene Spalten zu migrieren, hat das Unternehmen die intelligente Idee, Dummy-E-Mail-Adressen zu [email protected]
, z. B. [email protected]
, wobei der vollständige Name der vollständige Name des [email protected]
ohne Leerzeichen ist. Durch das Hinzufügen des Attributs [Required]
zum Feld Email
die folgende Migration erstellt:
public partial class AuthorsEmailRequired : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
}
public override void Down()
{
AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
}
}
Dies würde fehlschlagen, wenn sich einige NULL-Felder in der Datenbank befinden:
Der Wert NULL kann nicht in die Spalte 'Email' eingefügt werden, Tabelle 'App.Model.DatabaseContext.dbo.Authors'; Spalte erlaubt keine Nullen. UPDATE schlägt fehl
Das Hinzufügen des folgenden Befehls vor dem Befehl AlterColumn
hilft,
Sql(@"Update dbo.Authors
set Email = REPLACE(name, ' ', '') + N'@example.com'
where Email is null");
Der Aufruf der update-database
erfolgreich und die Tabelle sieht folgendermaßen aus (Beispieldaten werden angezeigt):
Andere Verwendung
Sie können die Sql()
Funktion für alle Arten von DML- und DDL-Aktivitäten in Ihrer Datenbank verwenden. Es wird als Teil der Migrationstransaktion ausgeführt. Wenn die SQL fehlschlägt, schlägt die vollständige Migration fehl und ein Rollback wird durchgeführt.
"Update-Datenbank" in Ihrem Code ausführen
Anwendungen, die nicht in Entwicklungsumgebungen ausgeführt werden, erfordern häufig Datenbankaktualisierungen. Nachdem Sie den Befehl Add-Migration
zum Erstellen Ihrer Datenbank-Patches verwendet haben, müssen Sie die Aktualisierungen in anderen Umgebungen und anschließend in der Testumgebung ausführen.
Die häufigsten Herausforderungen sind:
- Kein Visual Studio in Produktionsumgebungen installiert und
- Keine Verbindungen zu Verbindungs- / Kundenumgebungen in der Praxis erlaubt.
Eine Problemumgehung ist die folgende Codefolge, die prüft, ob Aktualisierungen ausgeführt werden, und führt sie der Reihe nach aus. Bitte sorgen Sie für korrekte Transaktionen und Ausnahmebehandlung, um sicherzustellen, dass im Fehlerfall keine Daten verloren gehen.
void UpdateDatabase(MyDbConfiguration configuration) {
DbMigrator dbMigrator = new DbMigrator( configuration);
if ( dbMigrator.GetPendingMigrations().Any() )
{
// there are pending migrations run the migration job
dbMigrator.Update();
}
}
Wo MyDbConfiguration
Ihre Migrationseinrichtung irgendwo in Ihren Quellen ist:
public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>
Ursprünglicher Entity Framework Code Erste Migration Schritt für Schritt
- Erstellen Sie eine Konsolenanwendung.
- Installieren Sie das EntityFramework-Nuget-Paket, indem Sie
Install-Package EntityFramework
in der "Package Manager Console"Install-Package EntityFramework
- Fügen Sie Ihre Verbindungszeichenfolge in der Datei app.config hinzu. Es ist wichtig,
providerName="System.Data.SqlClient"
in Ihre Verbindung aufzunehmen. - Erstellen Sie eine öffentliche Klasse nach Ihren Wünschen, z. B. "
Blog
". - Erstellen Sie Ihre ContextClass, die von DbContext erben, wie "
BlogContext
". - Definieren Sie eine Eigenschaft in Ihrem Kontext des DbSet-Typs. Etwas wie folgt:
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
}
public class BlogContext: DbContext
{
public BlogContext(): base("name=Your_Connection_Name")
{
}
public virtual DbSet<Blog> Blogs{ get; set; }
}
- Es ist wichtig, den Verbindungsnamen im Konstruktor zu übergeben (hier Your_Connection_Name).
- Führen Sie in der Package Manager Console den Befehl zum
Enable-Migration
. Dadurch wird ein Migrationsordner in Ihrem Projekt erstellt - Führen
Add-Migration Your_Arbitrary_Migraiton_Name
BefehlAdd-Migration Your_Arbitrary_Migraiton_Name
. Dies erstellt eine Migrationsklasse im Migrationsordner mit der Methode Up () und Down () - Führen Sie den Befehl
Update-Database
, um eine Datenbank mit einer Blogtabelle zu erstellen