Entity Framework Core– pierwsze spotkanie

Opublikowany Autor Piotr CudnikDodaj komentarz

Entity Framework (EF) jest narzędziem typu ORM (Object Relational Mapping) zapewniającym mapowanie obiektów na tabele bazy danych jak i w druga stronę otworzenie obiektów na podstawie bazy danych. Entity Framework Core jest lżejszą wersja EF zaprojektowaną do wykorzystania w projektach .Net Core. W artykule będę korzystał z wersji Entity Framework Core 1.1.2, obecnie dostępna jest nowsza wersja Entity Framework Core 2.0.0-preview2(jest to jeszcze wersja rozwijająca się). Niestety nie udało mi się poprawnie skonfigurować wersji innych pakietów z najnowszym EF Core 2.0 dlatego zmuszony byłem wrócić do starszej stabilnej i oficjalnej puki co wersji EF Core 1.1.2.

Do zaprezentowania przykładu Entity Framework Core wykorzystam:

  • Visual Studio Code
  • Bazę danych MS SQL
  • .Net Core

Zaczynamy od utworzenia nowego folderu o nazwie EFCore, który następnie otwieramy w Visual Studio Code. W terminalu (Ctrl+`) tworzymy nowy projekt konsolowy wpisując komendę

dotnet new console

do pakietu dodajemy EntityFrameworkCore.SqlServer do obsłużenia połączenia z bazą danych MS SQL oraz pakiet EntityFrameworkCore.Tools

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools

Następnie w csproj naszego projektu dopisujemy ręcznie referencje do EntityFrameworkCore.Tools.DotNet w sekcji DotNetCliToolReference

  </ItemGroup>
    <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" />
  </ItemGroup>

Zapisujemy wprowadzone zmiany. Po dodaniu pakietów i dopisaniu sekcji DotNetCliToolReference przebudowujemy nasz projekt poleceniem

dotnet restore

sprawdzamy czy Entity Framework Core poprawnie został podpięty do projekty

dotnet ef –h

Po sprawdzeniu, że poprawnie skonfigurowaliśmy Entity Framework Core możemy dodać DbContext. Tworzymy nowy plik MyDbContext.cs

using Microsoft.EntityFrameworkCore;

namespace EFCore

{
    public class MyDbContext: DbContext
    {
        public DbSet Person { get; set; }
        public DbSet Car { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
           optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=EFCore;Trusted_Connection=True;MultipleActiveResultSets=true");
        }
    }
}

Utóżmy również klase Person

using System;
using System.Collections.Generic;

namespace EFCore

{
    public class Person
    {
        public int PersonId { get; set; }
        public string Name {get; set;}
        public string Surname {get; set;}
        public DateTime Birth {get; set;}
        public decimal Height {get; set;}
        public ICollection<Car> Cars {get; set;}
    }
}

oraz klase  Car

namespace EFCore
{
    public class Car
    {
        public int CarId { get; set; }
        public string Brand {get; set;}
        public string Model {get; set;}
        public int YearOfProduction {get; set;}
        public string RegistrationNo {get; set;}
    }
}

Możemy teraz zrobić migracje do bazy danych. Wywołujemy polecenie

dotnet ef migrations add CreateDatabase
dotnet ef database update

W projekcie pojawi się nowy folder  Migrations z wygenerowanymi skryptami tworzącymi tabel Person i Car w bazie danych. Po uruchomieniu polecenia update tabele zostały utworzone w bazie danych.

Do naszego programu dodajmy wstawienie i odczytanie przykładowych danych. W pliku Program.cs umieszczamy logikę zapisu i odczytu przykładowych danych.

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace EFCore
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Przyklad EFCore.");

            //Zapisanie danych do bazy danych
            using (var db = new MyDbContext())
            {
                var person = db.Set();
                person.Add(new Person
                {
                    Name = "John",
                    Surname = "Doe",
                    Birth = new DateTime(1993, 8, 18),
                    Height = 1.74M,
                    Cars = new List { new Car() { Brand = "Fiat", Model = "Panda", YearOfProduction = 2012, RegistrationNo = "ERA91TL" } }
                });

                person.Add(new Person
                {
                    Name = "Peter",
                    Surname = "Griftin",
                    Birth = new DateTime(1983, 3, 12),
                    Height = 1.84M,
                    Cars = new List{ new Car(){ Brand = "Ford", Model = "Focus", YearOfProduction = 2010, RegistrationNo = "WRD230L"},
                                           new Car(){ Brand = "Chevrolet ", Model = "Traverse", YearOfProduction = 2017, RegistrationNo = "WRD8I04"} }
                });

                db.SaveChanges();
            }

            //Odczytanie danych z bazy danych
            using (var db = new MyDbContext())
            {
                var persons =  db.Person.Include("Cars");
                foreach (var person in persons)
                {
                  Console.WriteLine(string.Format("Person:{0} {1} urodzony {2:yyyy-MM-dd} wzrost:{3}m",person.Name,person.Surname,person.Birth,person.Height));
                  foreach (var car in person.Cars)
                  {
                    Console.WriteLine(string.Format("\tCar:{0} {1} z {2}r. rejestracja: {3} ",car.Brand,car.Model,car.YearOfProduction,car.RegistrationNo));
                  }     
                }            
            }
        }
    }
}

Budujemy nasz projekt

dotnet build

Następnie uruchamiamy

dotnet run

Po uruchomieni projektu otrzymamy następujący wynik:

Przyklad EFCore.
Person:John Doe urodzony 1993-08-18 wzrost:1,74m
        Car:Fiat Panda z 2012r. rejestracja: ERA91TL
Person:Peter Griftin urodzony 1983-03-12 wzrost:1,84m
        Car:Ford Focus z 2010r. rejestracja: WRD230L
        Car:Chevrolet  Traverse z 2017r. rejestracja: WRD8I04