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();
}