我使用EntityFrameworkCore 2.0将实体Name
中的属性UnitType
设置为Unique for SQLite。
modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique();
但它表现为区分大小写。表示它将 Gram
和 gram
视为两个不同的值并插入它们。在将大部分时间花在MS-SQL上之后,这显然不是我所期待的。
另外,另一个问题是在此列上过滤数据时。即使这是区分大小写的。
db.Units.Where(w => w.Name.Contains(SearchText));
如何使其不区分大小写?
答案 0 :(得分:2)
SQLite的默认行为区分大小写。
要将列设置为不区分大小写,需要使用COLLATE NOCASE。
所以我们也需要添加这一行。
modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE");
这将确保 Gram
和 gram
被理解为相同的值,因此唯一约束将限制插入一个,如果其他是已经在场了。
要过滤,有两种方法。
1)将Column值和搜索文本转换为小写或大写。
db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant()));
2)使用带有通配符的Like关键字而不是Contain
db.Units.Where(w => EF.Functions.Like(w.Name, $"%{SearchText}%"));
此外,我已经阅读过将列转换为更低或更高的位置将导致数据库引擎转换该列的所有值,这可能是大型数据集的性能瓶颈。所以我建议使用第二种方法。