Szukaj…


Włącz migracje

Aby włączyć migrację kodu po raz pierwszy w strukturze encji, użyj polecenia

Enable-Migrations

w konsoli Menedżera pakietów .

Musisz mieć prawidłową implementację DbContext zawierającą obiekty bazy danych zarządzane przez EF. W tym przykładzie kontekst bazy danych będzie zawierał obiekty BlogPost i Author :

internal class DatabaseContext: DbContext
{
    public DbSet<Author> Authors { get; set; }

    public DbSet<BlogPost> BlogPosts { get; set; }
}

Po wykonaniu polecenia powinny pojawić się następujące dane wyjściowe:

PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>

Ponadto powinien pojawić się nowy folder Migrations z jednym plikiem Configuration.cs wewnątrz: Układ projektu DB

Następnym krokiem byłoby utworzenie pierwszego skryptu migracji bazy danych, który utworzy początkową bazę danych (patrz następny przykład).

Dodaj swoją pierwszą migrację

Po włączeniu migracji (zapoznaj się z tym przykładem ) możesz teraz utworzyć pierwszą migrację zawierającą wstępne utworzenie wszystkich tabel, indeksów i połączeń z bazą danych.

Migrację można utworzyć za pomocą polecenia

Add-Migration <migration-name>

To polecenie utworzy nową klasę zawierającą dwie metody w Up i w Down które są używane do zastosowania i usunięcia migracji.

Teraz zastosuj polecenie na podstawie powyższego przykładu, aby utworzyć migrację o nazwie Początkowa :

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.

Utworzono nowy znacznik czasu pliku _Initial.cs (pokazano tylko ważne rzeczy):

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");
}

Jak widać, w metodzie Up() tworzone są dwie tabele Authors i BlogPosts i odpowiednio tworzone są pola. Ponadto relacja między dwiema tabelami jest tworzona przez dodanie pola Author_AuthorId . Z drugiej strony metoda Down() próbuje odwrócić działania migracyjne.

Jeśli masz pewność co do migracji, możesz zastosować migrację do bazy danych za pomocą polecenia:

Update-Database

Wszystkie oczekujące migracje (w tym przypadku Początkowa migracja) są stosowane do bazy danych, a następnie stosowana jest metoda inicjująca (odpowiedni przykład)

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.

Możesz zobaczyć wyniki działań w eksploratorze SQL: przegląd bazy danych

Dla poleceń Add-Migration i Update-Database dostępnych jest kilka opcji, których można użyć do ulepszenia działań. Aby zobaczyć wszystkie opcje, użyj

get-help Add-Migration

i

get-help Update-Database

Seedowanie danych podczas migracji

Po włączeniu i utworzeniu migracji może być konieczne wstępne wypełnienie lub migracja danych w bazie danych. Istnieje kilka możliwości, ale w przypadku prostych migracji można użyć metody „Seed ()” w pliku Konfiguracja utworzonym po wywołaniu opcji enable-migrations .

Funkcja Seed() pobiera kontekst bazy danych, ponieważ jest to tylko parametr i możesz wykonywać operacje EF wewnątrz tej funkcji:

protected override void Seed(Model.DatabaseContext context);

Możesz wykonywać wszystkie rodzaje czynności w Seed() . W przypadku niepowodzenia cała transakcja (nawet zastosowane łaty) jest wycofywana.

Przykładowa funkcja, która tworzy dane tylko wtedy, gdy tabela jest pusta, może wyglądać następująco:

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();
    }
}

AddOrUpdate() funkcją zapewnianą przez programistów EF jest metoda rozszerzenia AddOrUpdate() . Ta metoda pozwala aktualizować dane na podstawie klucza podstawowego lub wstawiać dane, jeśli jeszcze nie istnieją (przykład pochodzi z wygenerowanego kodu źródłowego 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" }
    );
}

Pamiętaj, że Seed() jest wywoływany po zastosowaniu ostatniej łatki. Jeśli potrzebujesz migrować lub inicjować dane podczas łatek, musisz zastosować inne podejście.

Używanie Sql () podczas migracji

Na przykład: Przeprowadzisz migrację istniejącej kolumny z niepotrzebnej do wymaganej. W takim przypadku może być konieczne wypełnienie niektórych wartości domyślnych w migracji dla wierszy, w których zmienione pola są w rzeczywistości NULL . W przypadku gdy wartość domyślna jest prosta (np. „0”), możesz użyć właściwości default lub defaultSql w definicji kolumny. W przypadku, gdy nie jest to takie łatwe, możesz użyć funkcji Sql() funkcjach członkowskich Up() lub Down() swoich migracji.

Oto przykład. Zakładając, że autor klasy zawiera adres e-mail jako część zestawu danych. Teraz decydujemy się na podanie adresu e-mail jako pola wymaganego. Aby dokonać migracji istniejących kolumn firma ma inteligentne pomysł stworzenia fikcyjnych adresów e-mailowa jak [email protected] , gdzie pełna nazwa to twórcom pełną nazwę bez spacji. Dodanie atrybutu [Required] do pola Email spowodowałoby następującą migrację:

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));
    }
}

Nie udałoby się to, gdyby niektóre pola NULL znajdowały się w bazie danych:

Nie można wstawić wartości NULL w kolumnie „E-mail”, tabela „App.Model.DatabaseContext.dbo.Authors”; kolumna nie zezwala na wartości null. UPDATE kończy się niepowodzeniem.

Dodanie następujących elementów, takich jak przed poleceniem AlterColumn , pomoże:

Sql(@"Update dbo.Authors
    set Email = REPLACE(name, ' ', '') + N'@example.com'
    where Email is null");

Wywołanie update-database powiodło się, a tabela wygląda następująco (pokazano przykładowe dane):

Przykładowe dane autora

Inne zastosowanie

Możesz użyć funkcji Sql() dla wszystkich typów aktywności DML i DDL w bazie danych. Jest wykonywany jako część transakcji migracji; Jeśli SQL nie powiedzie się, pełna migracja nie powiedzie się i wycofanie zostanie wykonane.

Wykonanie „Aktualizuj bazę danych” w swoim kodzie

Aplikacje działające w środowiskach innych niż programistyczne często wymagają aktualizacji baz danych. Po użyciu polecenia Add-Migration do utworzenia poprawek do bazy danych konieczne jest uruchomienie aktualizacji w innych środowiskach, a także w środowisku testowym.

Często spotykane wyzwania to:

  • program Visual Studio nie jest zainstalowany w środowiskach produkcyjnych, oraz
  • żadne połączenia nie są dozwolone w środowisku połączeń / klienta w prawdziwym życiu.

Obejściem jest następująca sekwencja kodu, która sprawdza aktualizacje do wykonania i wykonuje je w kolejności. Upewnij się, że transakcje i obsługa wyjątków są prawidłowe, aby żadne dane nie zostały utracone w przypadku błędów.

void UpdateDatabase(MyDbConfiguration configuration) {
   DbMigrator dbMigrator = new DbMigrator( configuration);
   if ( dbMigrator.GetPendingMigrations().Any() )
   {
      // there are pending migrations run the migration job
      dbMigrator.Update(); 
   }
}

gdzie MyDbConfiguration to konfiguracja migracji gdzieś w twoich źródłach:

public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>

Migracja kodu początkowego podmiotu Pierwsza krok po kroku

  1. Utwórz aplikację konsoli.
  2. Zainstaluj pakiet nugetowy EntityFramework, uruchamiając pakiet Install-Package EntityFramework w „Konsoli menedżera pakietów”
  3. Dodaj ciąg połączenia w pliku app.config. Ważne jest, aby dołączyć providerName="System.Data.SqlClient" do swojego połączenia.
  4. Utwórz klasę publiczną, jak chcesz, coś takiego jak „ Blog
  5. Utwórz swój ContextClass, który dziedziczy po DbContext, coś takiego jak „ BlogContext
  6. Zdefiniuj właściwość w kontekście typu DbSet, coś takiego:
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. Ważne jest, aby przekazać nazwę połączenia w konstruktorze (tutaj Your_Connection_Name)
  2. W konsoli Menedżera pakietów uruchom polecenie Enable-Migration , spowoduje to utworzenie folderu migracji w twoim projekcie
  3. Uruchom polecenie Add-Migration Your_Arbitrary_Migraiton_Name , spowoduje to utworzenie klasy migracji w folderze migracji dwiema metodami Up () i Down ()
  4. Uruchom polecenie Update-Database , aby utworzyć bazę danych z tabelą blogów


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow