2022-0302

EF/EFCore访问Oracle数据库命不中索引,执行慢问题

作者: momy 分类: 黑客动态 0 Comment »
摘要:如果你Oracle数据库的字段类型varchar2,你C#的model类使用string则默认会命不中索引,造成执行性能慢问题

如果你Oracle数据库的字段类型varchar2,你C#的model类使用string则默认会命不中索引,造成执行性能慢问题


EFCore解决方案:

因为EF访问Oracle默认支持Unicode数据类型,默认将string映射为nvarchar2,如果数据库类型不是nvarchar2则无法命中索引。

重写context的OnModelCreating,将默认string映射修改为varchar2,即不支持Unicode类型即可

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //解决Unicode类型前加N后命不中索引问题
    foreach (var property in modelBuilder.Model.GetEntityTypes().SelectMany(t => t.GetProperties()).Where(p => p.ClrType == typeof(string)))
    {
        property.SetIsUnicode(false);
    }
    base.OnModelCreating(modelBuilder);
}


EF解决方案:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //解决Unicode类型前加N后命不中索引问题
    modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
    base.OnModelCreating(modelBuilder);
}


至此可解决因数据类型不一致造成的数据库查询性能问题

标签: EFCore Unicode SetIsUnicode 阅读: 13274
上一篇: Nhibernate访问Oracle数据库命不中索引,执行慢问题 - 10565次
下一篇: 企业IT系统信息安全分析 - 1903次

向右滑动解锁留言