带有 EntityFrameworkCore 唯一列的 Sqlite 区分大小写。搜索也区分大小写

Anu*_*rma 1 c# sqlite entity-framework-core

我使用 EntityFrameworkCore 2.0 将Name实体中的一个属性UnitType设置为 SQLite 的唯一性。

modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique();
Run Code Online (Sandbox Code Playgroud)

但它的行为区分大小写。意味着它将Gramgram视为两个不同的值并插入它们。在我花了大量时间在 MS-SQL 上之后,这显然不是所期望的。

此外,另一个问题是过滤此列上的数据时。即使那是区分大小写的。

db.Units.Where(w => w.Name.Contains(SearchText));
Run Code Online (Sandbox Code Playgroud)

如何使它不区分大小写?

Anu*_*rma 6

SQLite 的默认行为区分大小写。

要使列不区分大小写,需要使用 COLLATE NOCASE。

所以我们也需要添加这一行。

modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE");
Run Code Online (Sandbox Code Playgroud)

这将确保Gramgram被理解为相同的值,因此如果其他已经存在,唯一约束将限制插入。

过滤有两种方法。

1) 将列值和搜索文本都转换为小写或大写。

db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant())); 
Run Code Online (Sandbox Code Playgroud)

2) 使用带有通配符的 Like 关键字而不是 Contain

db.Units.Where(w => EF.Functions.Like(w.Name, $"%{SearchText}%"));
Run Code Online (Sandbox Code Playgroud)

另外,我在某处读到将列转换为下或上将导致数据库引擎转换该列的所有值,这可能是大型数据集的性能瓶颈。所以我推荐使用第二种方法。