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.