W ostatnim poście wspomniałem o nowości zwanej Code Migrations. Pozwala ona przede wszystkim na inkrementalne rozszerzanie bazy danych bez konieczności jej ponownego usuwania i tworzenia.
Wróćmy do naszego przykładu związanego z klasą Person. Do klasy tej dodaliśmy pole Street:
Code:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int BirthYear { get; set; }
public string Street { get; set; }
}
co spowodowało rzucenie wyjątku mówiącego o niekompatybilnych modelach danych.
Spróbujmy więc - używając Code Migrations uaktualnić bazę bez konieczności jej rekreacji.
W pierwszej kolejności dodałem domyślny konstruktor do Contextu:
Code:
using System.Configuration;
using System.Data.Entity;
namespace EF_CodeFirst
{
public class DatabaseContext : DbContext
{
public DatabaseContext(string connectionString)
: base(connectionString)
{
}
public DatabaseContext()
: base(ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString"].ConnectionString)
{
}
public DbSet<Person> Persons { get; set; }
}
}
Następnie w oknie paczek wprowadzamy komendę:
PM> Enable-Migrations
Po pomyślnej instalacji w solucji zostanie dodany nowy folder wraz z plikami .cs:
Znaczenie poszczególnych plików:
- Configuration - definiuje jak migracja wpływa na Context.
- InitialCreate - ponieważ istnieje już stworzona baza danych, plik został wygenerowany i zawiera dane odnośnie obecnej postaci bazy danych.
Configuration.cs:
Code:
namespace EF_CodeFirst.Migrations
{
using System.Data.Entity.Migrations;
internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(DatabaseContext context)
{
}
}
}
InitialCreate.cs:
Code:
namespace EF_CodeFirst.Migrations
{
using System.Data.Entity.Migrations;
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"People",
c => new
{
Id = c.Int(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
BirthYear = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("People");
}
}
}
Komendy których będziemy używać w przypadku migracji:
- Add-Migration - zawiera zmiany dokonane na modelu
- Update-Database - uaktualnia bazę danych, wprowadzając dokonane zmiany
Aby dodać migrację dla pola Street wprowadzamy następujące polecenie w Package Manager:
PM> Add-Migration AddStreetToPersonClass
Została wygenerowana w tym momencie nowa klasa:
Code:
namespace EF_CodeFirst.Migrations
{
using System.Data.Entity.Migrations;
public partial class AddStreetToPersonClass : DbMigration
{
public override void Up()
{
AddColumn("People", "Street", c => c.String());
}
public override void Down()
{
DropColumn("People", "Street");
}
}
}
Następnie aby użyć stworzonej migracji oraz dodać pole do bazy wprowadzamy polecenie:
PM> Update-Database
Po zakończeniu procesu możemy zobaczyć, iż zmiany zostały wprowadzone do bazy danych:
Zauważyć można, iż dane pozostały w takiej formie jak przed dodaniem kolumny.
Brak komentarzy:
Prześlij komentarz