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