---
description: Completely reset database (Drop + Recreate + Migrations)
agent: efcore-db-reset
model: sonnet
---

# EF Core Database Reset

> **Ref:** [_shared.md](_shared.md)
> **WARNING:** SUPPRIME TOUTES LES DONNÉES!

---

## Conformité

| ❌ INTERDIT | ✅ OBLIGATOIRE |
|-------------|----------------|
| `sqlcmd` pour DDL/DML | `dotnet ef database drop` |
| Scripts .sql dans repo | `dotnet ef database update` |
| INSERT via scripts | `HasData()` pour seeding |

**Exception:** `sqlcmd` est autorisé UNIQUEMENT pour `BACKUP DATABASE`.

---

## STEP 0: Vérification Environnement

```bash
detect_environment
block_production  # BLOQUANT si Production
```

Afficher: base qui sera supprimée (SERVER, DATABASE).

---

## STEP 1: Confirmation

```javascript
AskUserQuestion({
  questions: [{
    question: "DANGER: Supprimer DÉFINITIVEMENT '" + DATABASE_NAME + "'? TOUTES LES DONNÉES SERONT PERDUES!",
    header: "Reset DB",
    options: [
      { label: "Oui, supprimer " + DATABASE_NAME, description: "Drop + Recreate (IRRÉVERSIBLE)" },
      { label: "Non, annuler", description: "Conserver la base" }
    ],
    multiSelect: false
  }]
})
```

---

## STEP 2: Backup (automatique si configuré)

Lire config: `.claude/gitflow/config.json` → `efcore.database.backupBeforeReset`

```javascript
AskUserQuestion({
  questions: [{
    question: "Backup de la base '" + DATABASE_NAME + "' avant suppression?",
    header: "Backup",
    options: [
      { label: "Oui, backup auto (Recommandé)", description: "Créer .bak via sqlcmd" },
      { label: "Non", description: "Données dev uniquement - continuer" },
      { label: "Backup manuel", description: "Via SSMS/Azure Portal (stoppe ici)" }
    ],
    multiSelect: false
  }]
})
```

**Si "Oui, backup auto":**

```bash
backup_database  # Fonction de _shared.md
```

**Si "Backup manuel":** Afficher instructions et stopper.

---

## STEP 2.5: Détection DbContext

```bash
detect_efcore_project   # Appelle detect_dbcontext() automatiquement
echo "DbContext: $DBCONTEXT"
```

**Si DbContext non détecté ou plusieurs contextes :**

```javascript
AskUserQuestion({
  questions: [{
    question: "Quel DbContext reset ? (ou 'both' pour les deux)",
    header: "DbContext",
    options: [
      { label: "CoreDbContext", description: "Reset schéma core uniquement" },
      { label: "ExtensionsDbContext", description: "Reset schéma extensions uniquement" },
      { label: "Les deux", description: "Reset complet (core + extensions)" }
    ],
    multiSelect: false
  }]
})
```

---

## STEP 3: Drop Database

```bash
dotnet ef database drop \
  --context "$DBCONTEXT" \
  --project "$INFRA_PROJECT" \
  --startup-project "$STARTUP_PROJECT" \
  --force
```

> **Note :** Si "Les deux" sélectionné, exécuter pour CoreDbContext puis ExtensionsDbContext.

---

## STEP 4: Recreate + Apply

```bash
dotnet ef database update \
  --context "$DBCONTEXT" \
  --project "$INFRA_PROJECT" \
  --startup-project "$STARTUP_PROJECT" \
  --verbose
```

---

## STEP 5: Seed (optionnel)

```javascript
AskUserQuestion({
  questions: [{
    question: "Peupler avec données test (HasData)?",
    header: "Seed",
    options: [
      { label: "Oui (recommandé)", description: "Appliquer HasData" },
      { label: "Non", description: "Base vide" }
    ],
    multiSelect: false
  }]
})
```

---

## Résumé

```
RESET - {DATABASE_NAME}
├── Environnement: {SELECTED_ENV}
├── Backup: {BACKUP_PATH|none}
├── Opérations: ✓ Drop, ✓ Create, ✓ {N} migrations
├── Conformité: ✓ EF Core CLI uniquement
└── Prochains: /efcore:db-status, /efcore:db-seed
```

---

## Options

| Option | Description |
|--------|-------------|
| `--env {name}` | Utiliser appsettings.{name}.json |

## Protections

| Protection | Description |
|------------|-------------|
| Env Display | Affiche base AVANT confirmation |
| Confirmation | Demande explicite avec NOM |
| Production Block | Bloque si Production détecté |
| EF Core Only | Pas de SQL brut |
