Conceito central:DbContext e simultaneamente um Unit of Work e um Repository. Ele rastreia mudancas e gera SQL automaticamente no SaveChanges.

Change Tracker β€” estados de uma entidade

Toda entidade rastreada pelo DbContext esta em um dos 5 estados. O SaveChanges gera SQL baseado nessas transicoes.

Add()SaveChangesQuery / Attachprop = xRemove()UPDATEDELETEDetachedAddedUnchangedModifiedDeletedSaveChangesgera SQL
EstadoO que significaSQL gerado no SaveChanges
DetachedNao rastreado pelo contextoNenhum
AddedNovo, sera inseridoINSERT
UnchangedLido do banco, sem alteracoesNenhum
ModifiedPropriedade alteradaUPDATE (so colunas modificadas)
DeletedMarcado para remocaoDELETE

Abordagens: Code-First vs Database-First

AspectoCode-FirstDatabase-First
Fonte de verdadeClasses C#Schema do banco
MigrationsGeradas a partir do modeloScaffold com dotnet ef dbcontext scaffold
Quando usarProjetos novos (greenfield)Banco existente (brownfield)
VantagemControle total do modelo, versionado em GitReusa schema existente sem reescrita
Qual o lifetime correto do DbContext?
DbContext deve ser Scoped β€” um por request HTTP. Ele nao e thread-safe. AddDbContext ja registra como Scoped por padrao. Em background services (Singleton), use IDbContextFactory ou IServiceScopeFactory para criar instancias por operacao. Nunca use Singleton β€” o change tracker acumula entidades e consome memoria.