sobota, 10 marca 2012

Entity Framework Code First, Migrations - bardziej złożony scenariusz

W ostatnim poście przedstawiłem w jaki sposób można wykorzystać migracje podczas dodawania nowego pola do encji.
Dziś pokażę, co oprócz prostego dodania pola do bazy potrafi Code-Based Migrations.

Do naszego modelu chcemy dołożyć encję reprezentującą samochód służbowy (CompanyCar). Do samochodów może być przypisanych wielu użytkowników.

Klasa samochód służbowy:


Code:
namespace EF_CodeFirst
{
    public class CompanyCar
    {
        public int Id { get; set; }
        public string Mark { get; set; }
        public string Producer { get; set; }
        public int ProductionYear { get; set; }
        public string RegisterNumber { get; set; }
    }
}

Do klasy użytkownika dodajemy relację do tabeli CompanyCar oraz dodatkowe pole SalesRepresentative (przedstawiciel handlowy):


Code:
namespace EF_CodeFirst
{
    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; }

        public bool SalesRepresentative { get; set; }
        public CompanyCar CompanyCar { get; set; }
    }
}

Następnie dodajemy kod pozwalający na komunikowanie się encji CompanyCar z bazą danych:


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; }
        public DbSet<CompanyCar> CompanyCars { get; set; } 
    }
}

Podobnie jak w poprzednim poście stworzymy nową migrację:
PM> Add-Migration AddSalesRepresentativeToPerson_CompanyCarEntity


Została wygenerowana następująca klasa:


Code:
namespace EF_CodeFirst.Migrations
{
    using System.Data.Entity.Migrations;
    
    public partial class AddSalesRepresentativeToPerson_CompanyCarEntity : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "CompanyCars",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Mark = c.String(),
                        Producer = c.String(),
                        ProductionYear = c.Int(nullable: false),
                        RegistrationNumber = c.String(nullable: false),
                    })
                .PrimaryKey(t => t.Id);
            
            AddColumn("People", "SalesRepresentative", c => c.Boolean(nullable: false));
            AddColumn("People", "CompanyCar_Id", c => c.Int());
            AddForeignKey("People", "CompanyCar_Id", "CompanyCars", "Id");
            CreateIndex("People", "CompanyCar_Id");
        }
        
        public override void Down()
        {
            DropIndex("People", new[] { "CompanyCar_Id" });
            DropForeignKey("People", "CompanyCar_Id", "CompanyCars");
            DropColumn("People", "CompanyCar_Id");
            DropColumn("People", "SalesRepresentative");
            DropTable("CompanyCars");
        }
    }
}

Dodajmy następujące zmiany:
  • kolumna SalesRepresentative będzie NOT NULL, oraz domyślana jej wartość będzie false
  • pole RegistrationNumber będzie NOT NULL, maksymalnie 10 znaków oraz unikalne w całej tabeli
 Zmiany które należy wprowadzić do klasy aby uzyskać taki efekt są następujące:


Code:
namespace EF_CodeFirst.Migrations
{
    using System.Data.Entity.Migrations;
    
    public partial class AddSalesRepresentativeToPerson_CompanyCarEntity : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "CompanyCars",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Mark = c.String(),
                        Producer = c.String(),
                        ProductionYear = c.Int(nullable: false),
                        RegisterNumber = c.String(nullable: false)
                    })
                .PrimaryKey(t => t.Id)
                .Index(u => u.RegisterNumber, unique: true);
            
            AddColumn("People", "SalesRepresentative", c => c.Boolean(nullable: false));
            AddColumn("People", "CompanyCar_Id", c => c.Int());
            AddForeignKey("People", "CompanyCar_Id", "CompanyCars", "Id");
            CreateIndex("People", "CompanyCar_Id");
        }
        
        public override void Down()
        {
            DropIndex("People", new[] { "CompanyCar_Id" });
            DropForeignKey("People", "CompanyCar_Id", "CompanyCars");
            DropColumn("People", "CompanyCar_Id");
            DropColumn("People", "SalesRepresentative");
            DropTable("CompanyCars");
        }
    }
}

Ostatnią czynnością którą należy zrobić - uaktualnienie bazy danych:
PM> Update-Database


Jak widać do bazy zostały dodane odpowiednie pola, żądanego typu oraz odpowiedniej długości.

Brak komentarzy:

Prześlij komentarz