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,UseNpgsqlberoende 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
IsConfiguredså 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
EnableSensitiveDataLoggingi 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”!