Entity Framework Core to lżejsza wersja starszego brata Entity Framework. Jego najważniejsza zaleta to możliwość wykorzystania w projektach .NET Core, czyli tym samym użycie na wielu platformach. Dziś opiszę swoje pierwsze przygody z EF Core.

Entity Framework Core

Aby rozpocząć pracę z EF Core należy dodać bibliotekę poprzez dotnet add package Microsoft.EntityFrameworkCore.SqlServer. Dlatego, że korzystam z MS SQL Server wybrałem właśnie takiego dostawcę dla EF Core. Warto w tym miejscu wspomnieć, że po za MS SQL Server można połączyć się m.in. z:

  • SQLite
  • InMemory
  • MySQL
  • PostgreSQL

W szczególności ciekawą opcję wydaje mi się InMemory, który pozwala na prototypowanie i testowania aplikacji bez konfiguracji lokalnego lub zewnętrznego środowiska bazodanowego. A jeśli zajdzie potrzeba pracy w środowisku produkcyjnym wystarczy przełączyć dostawcę (providera).

Utworzyłem prosty program, który dodaje obiekty typu Blog do bazy danych.

Tak wygląda ciało klasy Blog.

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Dodatkowo utworzyłem klasę EFContext w której odbywa się komunikacja z bazą dancyh. Co istotne dzięki dziedziczonemu DbContext można odpytywać i zapisywać dane. W moim przypadku klasa Blog będzie reprezentować model tabeli bazy danych dlatego, została utworzona właściowość typu DbSet<Blog>.

public class EFContext : DbContext
{
    string _connectionString;
    SqlConnectionStringBuilder builder;
    public EFContext()
    {
        builder = new SqlConnectionStringBuilder();
        builder.DataSource = "localhost";
        builder.UserID = "sa";
        builder.Password = "4BEsFpaq";
        _connectionString = builder.ConnectionString;
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(this._connectionString);
    }

    public DbSet<Blog> Blogs { get; set; }
}

Teraz należy użyć narzędzia dotnet ef, które wygeneruje odpowiedni kod wykonujący polecenia SQL tworzące bazę danych. Jednak najpierw zależności - dodajemy dotnet add package Microsoft.EntityFrameworkCore.Design. Potem z konsoli można wywołać dotnet ef migrations add InitialCreate. Zostanie utworzony nowy folter Migrations.

ef migrations

Niestety u mnie nie powiodło się to za pierwszym razem, konsola zwracała błąd, polecenie dotnet ef nie zostało znalezione. Okazało się, że wraz z dodaniem Microsoft.EntityFrameworkCore.Design powinna automatycznie znaleźć się w zależnościach biblioteka Microsoft.EntityFrameworkCore.Tools.DotNet odpowiedzialna za narzędzia EF, musiałem ją dodać ręcznie. Finalnie *.csproj wygląda tak:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />
    <PackageReference Include="System.Data.SqlClient" Version="4.3.0" />
  </ItemGroup>
   <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
  </ItemGroup>
</Project>

Następnie należy wykonać dotnet ef database update, które na podstawie najświeższego pliku migrancyjnego modyfikuje bazę danych (usuwa i tworzy tabele).

Finalnie prosty kawałek kodu, który dodaje nowego bloga do bazy danych, a następnie wyświetla wszyskie istniejące wiersze tabeli Blogs wygląda następująco.

using (var db = new EFContext())
{
    var newBlog = new Blog();
    newBlog.Url = "https://blog.pospieszynski.net";
    db.Blogs.Add(newBlog);
    var count = db.SaveChanges();
    Console.WriteLine("{0} records saved to database", count);

    Console.WriteLine();
    Console.WriteLine("All blogs in database:");
    foreach (var blog in db.Blogs)
    {
        Console.WriteLine(" - {0}", blog.Url);
    }
}

To co przedstawiłem to tylko wierzchołek góry lodowej, po więcej odsyłam do dokumentacji. Wraz z postępami przy projekcie DataBoard na pewno pojawi się więcej informacji o EFCore.