niedziela, 11 marca 2012

Entity Framework Code First - Migrations - SQL oraz downgrade

W poprzednim poście opisałem w jaki sposób korzystać z bardziej zaawansowanych elementów mechanizmu Code Migrations. Tym razem trochę o własnych skryptach SQL, które mogą być uruchamiane w czasie procesu migracji oraz o zmianie wersji do konkretnej wersji (wcześniejszej lub późniejszej)

1. Wywołanie własnego SQLa
Pierwszym problemem którym się zajmiemy jest wywołanie własnego SQLa. Zdarza się często, iż dodajemy pole i jego wartość jest zależna od innego pola. Jeżeli w bazie do tej porty nie było żadnych rekordów sprawa jest prosta, w przypadku gdy już były dane chcielibyśmy zapewne aby ta specyficzna wartość po dodaniu nowej kolumny, dla istniejących już rekordów została obliczona.

Dla celów testowych dodamy abstrakcyjne pole do klasy CompanyCar - MarkYear:


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; }
        public string MarkYear { get; set; }
    }
}

W polu tym będziemy chcieli umieścić informacje o Marce samochodu i jego roczniku. Generujemy więc tak jak to już pokazywałem migrację:


Code:
namespace EF_CodeFirst.Migrations
{
    using System.Data.Entity.Migrations;
    
    public partial class AddCarYearToCompanyCar : DbMigration
    {
        public override void Up()
        {
            AddColumn("CompanyCars", "MarkYear", c => c.String());
        }
        
        public override void Down()
        {
            DropColumn("CompanyCars", "MarkYear");
        }
    }
}

Teraz czas na dodanie naszego SQLa. RObimy to za pomocą funkcji Sql:


Code:
namespace EF_CodeFirst.Migrations
{
    using System.Data.Entity.Migrations;
    
    public partial class AddCarYearToCompanyCar : DbMigration
    {
        public override void Up()
        {
            AddColumn("CompanyCars", "MarkYear", c => c.String());
            Sql("UPDATE CompanyCars SET MarkYear = Mark + ' ' + ProductionYear");
        }
        
        public override void Down()
        {
            DropColumn("CompanyCars", "MarkYear");
        }
    }
}

Jak widać prosta i banalna sprawa.


2. Migracja do danej wersji
Czasami mamy ochotę na migrację do specyficznej wersji, bądź też migracja w dół czyli przywrócenie poprzedniego stanu (schematu) bazy danych.

Jeżeli chcielibyśmy wrócić stan naszej bazy do żadnego punktu wystarczy użyć komendy:
Update-Database –TargetMigration:"nazwa_migracji"
Migracja spowoduje cofnięcie zmian aż do migracji nazwa_migracji.

Jeżeli chcielibyśmy wrócić do stanu początkowego bazy, wystarczy użyć polecenia:
Update-Database –TargetMigration:$InitialDatabase 


3. Generowanie skryptu SQL
Pomimo tego iż wszyscy deweloperzy mogą wprowadzić zmiany po zakomitowaniu naszego kodu do SVN-a poprzez proste wywołanie komendy uaktualniającej bazę danych, istnieje czasami potrzeba wygenerowania pliku SQL zawierającego dokonywane modyfikacje.
Aby utworzyć skrypt stosuje się następujące polecenie:
Update-Database -Script -SourceMigration:"Od" -TargetMigration:"Do"
gdzie:
  • Od - oznacza od jakiej migracji mają zostać pobrane zmiany
  • Do - oznacza do której migracji ma skrypt dotyczyć
W przypadku, gdy nie wyspecyfikujemy drugiej części komendy, jako punkt końcowy zostanie wzięta ostatnia migracja.

Biorąc przykładowy projekt, który tworzyłem przez ostatnie posty, możemy stworzyć skrypt, który obejmie zmiany od stanu początkowego bazy danych aż do migracji o nazwie AddSalesRepresentativeToPerson_CompanyCarEntity
Wprowadzamy więc polecenie:
PM> Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration AddSalesRepresentativeToPerson_CompanyCarEntity

Po zakończeniu procesu zostanie wyświetlony skrypt SQL:



Tak oto zakończył się temat migracji w EF.
Kolejny post będzie dotyczył Fluent API oraz adnotacją.

4 komentarze:

  1. Dzięki za opisanie Code First Migrations.

    Czy wiesz w jaki sposób uruchomić Update-Database z kodu aplikacji?

    OdpowiedzUsuń
    Odpowiedzi
    1. Odpowiedź na pytanie: http://patryknet.blogspot.com/2012/03/ef-code-migrations-uruchomienie-z-kodu.html

      Usuń
  2. Szczerze mówiąc nie próbowałem. Postaram się zbadać sprawę i zamieszczę rezultaty.

    OdpowiedzUsuń
  3. Znalazłem rozwiązanie:
    http://pastebin.com/NT3app8G

    na podst:
    http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx

    OdpowiedzUsuń