Sensibilité à la casse et aux accents
Cette configuration est disponible pour SQL Server, MySQL v8+, MariaDB v10+, Oracle et PostgreSQL v11+. SQLite ne supporte pas la modification de sensibilité.
Il est préférable de régler la sensibilité à la création de la base de données. Il est possible de la définir après la création, mais cela n'impacte que les nouvelles tables ou colonnes. Une nouvelle migration est nécessaire après le changement.
À propos
La collation configure la sensibilité à la casse et aux accents de la base de données. Cette sensibilité s'applique aux recherches et aux tris. Dans Lagoon, la configuration se fait dans le modèle EF Core.
Sensibilité par défaut des SGBD
| SGBD | Sensibilité par défaut |
|---|---|
| SQL Server | Sensible aux accents et insensible à la casse. |
| Oracle / PostgreSQL | Sensible aux accents et à la casse. |
| MySQL / MariaDB | Insensible aux accents et à la casse. |
Configuration côté serveur
Collation française
La collation française se configure en passant un CollationType au constructeur du DbContext. Par défaut, la documentation historique Lagoon indique une configuration insensible à la casse et aux accents.
Remplacez un constructeur simple :
public ApplicationDbContext(DbContextOptions options)
: base(options)
{ }
par un constructeur avec collation :
public ApplicationDbContext(DbContextOptions options)
: base(options, CollationType.IgnoreCaseAndAccent)
{ }
Les valeurs disponibles sont :
| Valeur | Effet |
|---|---|
Argument null ou constructeur sans collation | Configuration par défaut du SGBD. |
CollationType.IgnoreCaseAndAccent | Insensible à la casse et aux accents. |
CollationType.IgnoreCase | Insensible à la casse mais sensible aux accents. |
CollationType.CaseSensitive | Sensible à la casse et aux accents. |
Après modification de la collation, créez une nouvelle migration EF Core.
Autres langues
Il est possible de construire une collation spécifique avec UseCollation(...) sur ModelBuilder. L'argument est le nom de la collation dans la base de données ; celle-ci doit exister dans le SGBD.
Désactivez la collation française si vous configurez manuellement une autre collation. La méthode GetCollationName(...) permet d'obtenir le nom selon le type de collation, la langue et le SGBD.
Les bases MariaDB, MySQL et PostgreSQL n'ont pas besoin d'avoir la langue précisée pour ce cas : elles utilisent le standard Unicode. Vous pouvez donc utiliser la collation française pour toutes les langues.
protected override void OnModelCreating(ModelBuilder builder)
{
// Applique d'abord la configuration héritée Lagoon/Identity.
base.OnModelCreating(builder);
// Configure une collation SQL Server basée sur Latin1_General.
builder.UseCollation(GetCollationName(CollationType.IgnoreCaseAndAccent, "Latin1_General"));
}
Collation pour un objet spécifique
PostgreSQL et Oracle ne supportent pas ce type de paramétrage par table ou colonne dans cette documentation Lagoon.
Table
Il est possible de configurer la sensibilité pour une table avec UseCollation(...).
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Configure la collation sur une table précise.
builder.Entity<Firm>().UseCollation(GetCollationName(CollationType.IgnoreCaseAndAccent, "Latin1_General"));
}
Colonne
Il est possible de configurer la sensibilité pour une colonne avec UseCollation(...).
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Configure la collation sur une colonne précise.
builder.Entity<Firm>()
.Property(f => f.Name)
.UseCollation(GetCollationName(CollationType.IgnoreCaseAndAccent, "Latin1_General"));
}
Requête
Pour utiliser une collation au niveau d'une requête seulement, utilisez EF.Functions.Collate(...).
IQueryable<Firm> firms = _db.Firms.Where(f => EF.Functions.Like(
EF.Functions.Collate(f.Name, GetCollationName(CollationType.IgnoreCaseAndAccent, "Latin1_General")),
"%ray%"));
Configuration côté client
Pour garder la cohérence entre les recherches côté client et côté serveur, réglez la sensibilité à l'identique des deux côtés.
Côté client, utilisez le paramètre global TextFilterCollation. Il pilote les filtres texte de l'interface, notamment les filtres de listes et de grilles.
Les valeurs disponibles sont celles de CollationType :
| Valeur | Effet |
|---|---|
CollationType.CaseSensitive | Sensible à la casse et aux accents. |
CollationType.IgnoreCase | Insensible à la casse mais sensible aux accents. |
CollationType.IgnoreCaseAndAccent | Insensible à la casse et aux accents. |
protected override void OnConfigureBehavior(ApplicationBehavior behavior)
{
// Aligne les filtres texte côté client avec la collation serveur.
behavior.TextFilterCollation = CollationType.IgnoreCaseAndAccent;
}