Konfigurera DbContext

Yay! Låt oss titta på hur vi berättar för DbContext hur den ska ansluta, logga och forma databasen. En välkonfigurerad kontext gör det enkelt att byta miljö och databas utan kodstormar.

TL;DR

Lägg anslutningssträngar i konfigurationen, använd OnConfiguring bara när du måste, och håll OnModelCreating till kartläggningsregler och seed-data.

Anslutningssträngar

{
  "ConnectionStrings": {
    "SchoolConnection": "Server=localhost;Database=school;User Id=sa;Password=P@ssword;"
  }
}
builder.Services.AddDbContext<SchoolContext>(options =>
{
    var cs = builder.Configuration.GetConnectionString("SchoolConnection");
    options.UseSqlServer(cs);
});
  • Byt databas genom att ändra strängen – ingen kod ändras.
  • Använd UseSqlite, UseSqlServer, UseMySql, UseNpgsql beroende på leverantör.

OnConfiguring – när är det användbart?

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlite("Data Source=school.db");
    }
}
  • Perfekt i små konsolappar eller tester.
  • Kontrollera gärna IsConfigured så att DI-inställningar inte skrivs över.

Bygga modellen i OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasIndex(s => s.Email)
        .IsUnique();

    modelBuilder.Entity<Course>()
        .Property(c => c.Name)
        .HasMaxLength(120);

    modelBuilder.Entity<Student>().HasData(
        new Student { Id = 1, Name = "Ada Lovelace" }
    );
}
  • Sätt index, längder, relationer och seed-data här.
  • All konfiguration i modellen blir till migrationer.

Loggning och diagnostik

optionsBuilder
    .LogTo(Console.WriteLine, LogLevel.Information)
    .EnableSensitiveDataLogging(builder.Environment.IsDevelopment());
  • Se genererade SQL-frågor när du felsöker.
  • Stäng av EnableSensitiveDataLogging i produktion för att skydda hemligheter.

Blanda flera databaser

builder.Services.AddDbContext<ReportContext>(options =>
    options.UseMySql(reportConnection, new MySqlServerVersion(new Version(8, 0, 36))));

builder.Services.AddDbContext<AppContext>(options =>
    options.UseSqlServer(appConnection));
  • Registrera en kontext per databas.
  • Injicera rätt kontext där den behövs – undvik att en kontext försöker prata med fler databaser än den känner till.

Obligatorisk Dad-joke

Varför älskar DbContext att gå på gym?

För att den alltid jobbar på “config-urationen”!


Upp

Upp


Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rättigheter förbehållna.
Du får använda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du får inte använda detta verk för kommersiella ändamål utan tillstånd från upphovsmannen.