【问题标题】:Sqlite with EntityFrameworkCore unique column is case sensitive. Search is also case sensitive具有 EntityFrameworkCore 唯一列的 Sqlite 区分大小写。搜索也区分大小写
【发布时间】:2017-10-06 15:29:30
【问题描述】:

我在实体 UnitType 中有一个属性 Name 使用 EntityFrameworkCore 2.0 为 SQLite 设置为 Unique。

modelBuilder.Entity<UnitType>().HasIndex(t => t.Name).IsUnique();

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

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

db.Units.Where(w => w.Name.Contains(SearchText));

如何让它不区分大小写?

【问题讨论】:

    标签: c# sqlite entity-framework-core


    【解决方案1】:

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

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

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

    modelBuilder.Entity<UnitType>().Property(t => t.Name).HasColumnType("TEXT COLLATE NOCASE");
    

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

    过滤有两种方法。

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

    db.Units.Where(w => w.Name.ToLowerInvariant().Contains(SearchText.ToLowerInvariant())); 
    

    2) 使用 Like 关键字和通配符而不是 Contain

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

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

    【讨论】:

    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2013-06-15
    • 2013-04-17
    • 2017-12-01
    • 2013-06-26
    相关资源
    最近更新 更多