• Entity Framework Core


    索引

      索引是跨多个数据存储区的常见概念。虽然它们在数据存储中的实现可能有所不同,但它们用于提高基于一列(或一组列)的查找效率。

      不能使用数据注释创建索引。你可以使用Fluent API来指定单个列的索引,如下所示:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url);
    }

      指定多个列的索引:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasIndex(p => new { p.FirstName, p.LastName });
    }

      按照约定,在用作外键的每个属性(或一组属性)中创建索引。

       EF Core对每个不同的属性集只支持一个索引。如果您使用Fluent API在一组属性上配置索引,这些属性已经定义了索引(按照约定或以前的配置),那么您将更改该索引的定义。如果您想要进一步配置根据约定创建的索引,这很有用。

    1、唯一索引

      默认情况下,索引不是唯一的:允许多行索引的列有相同的值。你可以让一个索引唯一,如下所示:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .IsUnique();
    }

      试图为唯一索引的列集插入多个具有相同值的实体将导致抛出异常。

    2、索引名称

      

    按照约定,在关系数据库中创建的索引命名为IX_<类型名>_<属性名>。对于复合索引,<属性名>将成为一个下划线分隔的属性名列表。

     

    你可以使用Fluent API来设置在数据库中创建的索引的名称:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .HasDatabaseName("Index_Url");
    }

    3、索引筛选器

      有些关系数据库允许指定过滤索引或部分索引。这允许您仅为列值的子集建立索引,从而减少索引的大小并提高性能和磁盘空间使用。有关SQL Server过滤索引的更多信息,请参阅文档。

      你可以使用Fluent API在索引上指定一个过滤器,它以SQL表达式的形式提供:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .HasFilter("[Url] IS NOT NULL");
    }

      当使用SQL Server提供程序时,EF为唯一索引中所有可为空的列添加了一个“IS NOT NULL”过滤器。若要重写此约定,您可以提供一个空值:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .IsUnique()
            .HasFilter(null);
    }

    3、包含列

      一些关系数据库允许您配置一组列,这些列包含在索引中,但不是索引“键”的一部分。当查询中的所有列都作为键或非键列包含在索引中时,这可以显著提高查询性能,因为表本身不需要被访问。有关SQL Server包含的专栏的更多信息,请参阅文档

      在下面的示例中,Url列是索引键的一部分,因此对该列进行的任何查询过滤都可以使用索引。但除此之外,仅访问Title和PublishedOn列的查询不需要访问表,运行效率更高:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasIndex(p => p.Url)
            .IncludeProperties(p => new
            {
                p.Title,
                p.PublishedOn
            });
    }
  • 相关阅读:
    测试 多线程 实现 callable 带返回值
    给定一个 hashMap 最终输出最大值的键
    正则判断输入的字符(英文、数字、空格、其他)的个数
    当返回值为json字符串时 如何获得其中的json数组
    thread run 和 start 的区别
    docker 构建dockerfile
    jsonp 跨域
    springsession 实现session 共享
    通过反射获得 spring 的 RequestMapping value值
    redis 集群搭建 以及 报错解决
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/14159796.html
Copyright © 2020-2023  润新知