Aller au contenu principal

Sensibilité à la casse et aux accents

Support SGBD

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​

SGBDSensibilité par défaut
SQL ServerSensible aux accents et insensible à la casse.
Oracle / PostgreSQLSensible aux accents et à la casse.
MySQL / MariaDBInsensible 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 :

ApplicationDbContext.cs
public ApplicationDbContext(DbContextOptions options)
: base(options)
{ }

par un constructeur avec collation :

ApplicationDbContext.cs
public ApplicationDbContext(DbContextOptions options)
: base(options, CollationType.IgnoreCaseAndAccent)
{ }

Les valeurs disponibles sont :

ValeurEffet
Argument null ou constructeur sans collationConfiguration par défaut du SGBD.
CollationType.IgnoreCaseAndAccentInsensible à la casse et aux accents.
CollationType.IgnoreCaseInsensible à la casse mais sensible aux accents.
CollationType.CaseSensitiveSensible à la casse et aux accents.
Migration obligatoire

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.

MySQL, MariaDB et PostgreSQL

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.

ApplicationDbContext.cs
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

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(...).

ApplicationDbContext.cs
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(...).

ApplicationDbContext.cs
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(...).

ApplicationDbContext.cs
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​

Cohérence client/serveur

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 :

ValeurEffet
CollationType.CaseSensitiveSensible à la casse et aux accents.
CollationType.IgnoreCaseInsensible à la casse mais sensible aux accents.
CollationType.IgnoreCaseAndAccentInsensible à la casse et aux accents.
Main.cs
protected override void OnConfigureBehavior(ApplicationBehavior behavior)
{
// Aligne les filtres texte côté client avec la collation serveur.
behavior.TextFilterCollation = CollationType.IgnoreCaseAndAccent;
}