piątek, 9 marca 2012

Entity Framework Code First

W tym poście zostanie omówiony model CodeFirst dla EF.
Zaczniemy od instalacji EF za pomocą konsoli NuGet:
W konsoli wpisujemy następujące polecenie:
Install-Package EntityFramework






Po instalacji referencje do odpowiedniej biblioteki dll zostaną automatycznie dodane do projektu.

Następnym krokiem będzie zdefiniowanie naszego modelu. W tym celu stworzymy prostą klasę przechowującą informację o użytkowniku:


Code:
    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int BirthYear { get; set; }
    }

Następnym krokiem jest stworzenie Contextu, za pomocą którego będziemy porozumiewali się z bazą danych:


Code:
    public class DatabaseContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }
    }

Następnie spróbujmy wykorzystać stworzony przez nas Context aby dodać nową osobę do bazy danych:


Code:
namespace EF_CodeFirst
{
    class Program
    {
        static void Main()
        {
            using (var context = new DatabaseContext())
            {
                context.Persons.Add(new Person{BirthYear = 2000, FirstName = "Jan", LastName = "Kowalski"});
                context.SaveChanges();
            }
        }
    }
}

Jeżeli zobaczymy poniższy wyjątek:


Oznacza to, iż provider ma problem z odnalezieniem serwera bazy danych. Rozwiązaniem tego problemu jest jawne podanie connection stringa do naszej bazy danych (w większości przypadków będziemy tak postępowali):

1. Do klasy dziedziczącej z DbContextu dodajemy konstruktor przyjmujący ConnectionString:


Code:
using System.Data.Entity;

namespace EF_CodeFirst
{
    public class DatabaseContext : DbContext
    {
        public DatabaseContext(string connectionString)
            : base(connectionString)
        {
        }

        public DbSet<Person> Persons { get; set; }
    }
}


2. W App/Web configu podajemy odpowiedni connectionString:


Code:
  <connectionStrings>
    <add connectionString="Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=SSPI;" 
         name="MyDatabaseConnectionString"
         providerName="System.Data.SqlClient"/>
  </connectionStrings>

3. Zmieniamy kod wykorzystujący DbContext:


Code:
using System.Configuration;

namespace EF_CodeFirst
{
    class Program
    {
        static void Main()
        {
            var connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString"].ConnectionString;

            using (var context = new DatabaseContext(connectionString))
            {
                context.Persons.Add(new Person{BirthYear = 2000, FirstName = "Jan", LastName = "Kowalski"});
                context.SaveChanges();
            }
        }
    }
}

Teraz, po uruchomieniu programu możemy zobaczyć co się stało na serwerze bazo danowym. Za pomocą MS możemy zobaczyć iż została stworzona z automatu nowa baza danych z odpowiednią tabelą, oraz dodany rekord:


Jak widać nie napisaliśmy ani jednej linijki kodu SQL, a baza danych została wygenerowana.

Spróbujmy teraz dodać nowe pole (street) do klasy reprezentującej naszą osobę:


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

Po ponownym uruchomieniu programu otrzymamy następujący wyjątek:


Link podany w treści wyjątku prowadzi do strony gdzie opisano nowość w EF - code migrations.
O tej nowości napiszę w kolejnym poście związanym z EF Code First.

2 komentarze:

  1. "Jeżeli zobaczymy poniższy wyjątek:
    Oznacza to, iż provider ma problem z odnalezieniem serwera bazy danych."

    U mnie wyjątek występuje co jest poprawne. Zastanawiam się jednak nad sytuacją gdy błąd ten nie wystąpi. EF ma jakiś mechanizm domyślnych ustawień connectionstringa?

    Maciej Lis

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak jeżeli jest zainstalowana baza SQL Server w wersji Express. Wtedy instancja bazy zostanie domyślnie utworzona właśnie na tym serwerze.

      Usuń