Entity framework – DI

V minulém díle jsme si ukázali jak rozject EF core nad MySQL databází – DB first dnes navážeme trochu obecne. Níže uvedené tipy je možno pužít pro libovolnou DB při přístupu DB first.

DBContext – odebrání connection stringu

Při defaultním generování database first je ve vygenerovaném DbContext souboru uložen connection string pro připojení do DB včetně citlivých údajů:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
        => optionsBuilder.UseMySql("server=localhost;user=root;database=app_cz", Microsoft.EntityFrameworkCore.ServerVersion.Parse("5.7.17-mysql"));

Do zdrojového kódu nepatří žádné přístupové údaje, ty patří do konfiguračního souboru (appsettings.json) aby je bylo jednoduché kdykoliv změnit. Celou metodu protected override void OnConfiguring uvedenou výše tedy můžeme odstranit.

Do Program.cs přidáme:

//EF
// Replace with your server version and type.
// Use 'MariaDbServerVersion' for MariaDB.
// Alternatively, use 'ServerVersion.AutoDetect(connectionString)'.
// For common usages, see pull request #1233.
var serverVersion = new MySqlServerVersion(new Version(8, 0, 29));

// Replace 'YourDbContext' with the name of your own DbContext derived class.
builder.Services.AddDbContext<ComameEuContext>(
    dbContextOptions => dbContextOptions
        .UseMySql(builder.Configuration["ConnectionStrings:DefaultConnection"], serverVersion)
        // The following three options help with debugging, but should
        // be changed or removed for production.
        .LogTo(Console.WriteLine, LogLevel.Information)
        .EnableSensitiveDataLogging()
        .EnableDetailedErrors());

Pro případný Microsoft SQL Server je konfigurace trochu elegantnější:

//EF
builder.Services.AddDbContext(options =>
{
   options.UseSqlServer(builder.Configuration["ConnectionStrings:DefaultConnection"]);
});

A connectionstring uložíme do konfiguračního souboru appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;user=root;database=app_cz"
  },
  "Logging": {
...

DI pro použití DbContext

Nyní zbývá dořešit poslední problém z minulé ukázky. DbContext je nejlepší injectount na požadované místo použití.

public class MyService
{
    private readonly AppCzContext _dbContext;

    public MyService(AppCzContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IEnumerable<User> GetUsers()
    {
        return _dbContext.Users.ToList();
    }
}

Asynchronní dotazy

Další a dnešní poslední tip je pro používání asynchronních dotazů. Asynchronními dotazy zvyšujete výkon a odezvu vaší aplikace, efektivněji využíváte prostředky a minimalizujete blokování vláken. Takže příště už jen takto:

public async Task<IEnumerable<User>> GetUsersAsync()
{
    return await _dbContext.Users.ToListAsync();
}

.Net + EF core – database first – MySql

Entity Framework je populární ORM (Object-Relational Mapping) framework pro aplikace v .NET, který vám umožňuje pracovat s databází. Při použití Entity Frameworku, si můžete vybrat mezi dvěma hlavními přístupy: Code First a Database First. V tomto případě chcete pracovat s databází MySQL pomocí přístupu Database First, což znamená, že generujete třídy entit z existující databáze. Vygenerování modelových tříd z DB tabulek se nazývá scaffolding. Dnes si ukážeme jak toho dosáhnout v .NET6 a Entity Frameworku pro MySql databázi.

Přes Package Manager Console nainstalujte Entity Framework Core a MySQL Provider

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Pomelo.EntityFrameworkCore.MySql

Vygenerujeme entity z tabulek DB

Použijte Entity Framework Core CLI k vytvoření databáze. Otevřete příkazový řádek, přejděte do adresáře vašeho projektu a použijte:

dotnet ef dbcontext scaffold "server=localhost;user=root;password=xxx;database=app_cz" "Pomelo.EntityFrameworkCore.MySql" --output-dir Models -f

Tím pro každou tabulku vygenerujeme do složky Models odpovídající modelovou třídu a DbContex soubor (v našem případě AppCzContext.cs)

Pozor: ve vygenerovaném AppCzContext.cs je automaticky doplněn server a přístupové údaje k DB. Není vhodné tyto údaje na tomto místě držet, měly by se načítat z appsettings.json. Ale o tom zase někdy příště 🙂

Jednoduché použití DbContextu

Získáme všechny uživatele:

using (var dbContext = new AppCzContext())
{
   var users = dbContext.Users.ToList();
}

Pozor: jedná se o jednoduchou ukázku. Lepší řešení je si přes DI injecntou DB context. Ale o tom zaseněkdy příště