Konfigurera DbContext

DbContext ska inte veta var databasen står eller vad den heter för sig själv — den ska få de uppgifterna utifrån. Det gör det möjligt att byta databas mellan utveckling, test och produktion utan att röra en rad kod.

Anslutningssträngar i appsettings

{
"ConnectionStrings": {
"SchoolConnection": "Server=localhost;Database=school;User Id=sa;Password=P@ssword;"
}
}
builder.Services.AddDbContext<SchoolContext>(options =>
{
var connectionString = builder.Configuration.GetConnectionString("SchoolConnection");
options.UseSqlServer(connectionString);
});

Byt provider genom att byta metod — UseSqlite, UseSqlServer, UseMySql, UseNpgsql — och byt databas genom att byta strängen i konfigurationen. Koden rör du aldrig.

OnConfiguring — bara som nödfallback

OnConfiguring finns kvar av bakåtkompatibilitetsskäl och är bekväm i småtestkonsoller, men i en riktig applikation ska DI:n redan ha konfigurerat kontexten innan den når hit:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite("Data Source=school.db");
}
}

IsConfigured-kollen är poängen — utan den skriver du av misstag över det DI redan satt upp.

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

Index, textlängder, relationer och seed-data hör hemma här — allt du sätter i modellen blir en del av nästa migration.

Loggning och diagnostik

optionsBuilder
.LogTo(Console.WriteLine, LogLevel.Information)
.EnableSensitiveDataLogging(builder.Environment.IsDevelopment());

LogTo visar dig den genererade SQL:en när du felsöker en LINQ-fråga som inte gör vad du väntade dig. EnableSensitiveDataLogging skriver ut parametervärden i klartext i loggen — bra under utveckling, en läcka du inte vill ha i produktion. Villkora den mot miljön, som ovan.

Flera databaser i samma app

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

En kontext per databas, injicerad där den behövs. Låt aldrig en kontext försöka prata med en databas den inte äger.

Obligatorisk dad-joke

Varför är DbContext så bra på gym?

Den har alltid koll på sin egen konfiguration.