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.
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.

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.