Ho un Name
proprietà nell'entità UnitType
impostato su Unique per SQLite utilizzando EntityFrameworkCore 2.0.
modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique();
Ma si comporta come maiuscole e minuscole. Significa che considera Gram
e gram
come due valori diversi e li inserisce. Questo chiaramente non è cosa aspettarsi dopo aver dedicato molto del mio tempo a MS-SQL.
Inoltre, un altro problema è quando si filtrano i dati su questa colonna. Anche questo è case sensitive.
db.Units.Where(w => w.Name.Contains(SearchText));
Come renderlo case insensitive?
Il comportamento predefinito di SQLite è case sensitive.
Per rendere una colonna come maiuscole e minuscole, è necessario utilizzare COLLATE NOCASE.
Quindi dobbiamo aggiungere anche questa linea.
modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE");
Ciò assicurerà che Gram
e gram
siano intesi come gli stessi valori e quindi un vincolo unico limiterà l'inserimento di uno se l'altro è già presente.
Per filtrare ci sono due metodi.
1) Converti sia il valore della colonna che il testo di ricerca in lettere minuscole o maiuscole.
db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant()));
2) Utilizzare la parola chiave Like con caratteri jolly anziché Contain
db.Units.Where(w => EF.Functions.Like(w.Name, $"%{SearchText}%"));
Inoltre, ho letto da qualche parte che la conversione della colonna in basso o in alto farà sì che il motore di database possa convertire tutti i valori di quella colonna, che potrebbe essere il collo di bottiglia delle prestazioni su un set di dati di grandi dimensioni. Quindi ti consiglio di usare il secondo metodo.