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: DB-Projektlayout

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: Datenbankübersicht

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):

Beispiel Autorendaten

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

  1. Erstellen Sie eine Konsolenanwendung.
  2. Installieren Sie das EntityFramework-Nuget-Paket, indem Sie Install-Package EntityFramework in der "Package Manager Console" Install-Package EntityFramework
  3. Fügen Sie Ihre Verbindungszeichenfolge in der Datei app.config hinzu. Es ist wichtig, providerName="System.Data.SqlClient" in Ihre Verbindung aufzunehmen.
  4. Erstellen Sie eine öffentliche Klasse nach Ihren Wünschen, z. B. " Blog ".
  5. Erstellen Sie Ihre ContextClass, die von DbContext erben, wie " BlogContext ".
  6. 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; }
}
  1. Es ist wichtig, den Verbindungsnamen im Konstruktor zu übergeben (hier Your_Connection_Name).
  2. Führen Sie in der Package Manager Console den Befehl zum Enable-Migration . Dadurch wird ein Migrationsordner in Ihrem Projekt erstellt
  3. Führen Add-Migration Your_Arbitrary_Migraiton_Name Befehl Add-Migration Your_Arbitrary_Migraiton_Name . Dies erstellt eine Migrationsklasse im Migrationsordner mit der Methode Up () und Down ()
  4. Führen Sie den Befehl Update-Database , um eine Datenbank mit einer Blogtabelle zu erstellen


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow