Entity-Framework-索引

7次阅读

共计 1322 个字符,预计需要花费 4 分钟才能阅读完成。

Entity Framwework 6 设置和使用索引,是一个比较 egg 疼的事情,为什么这么说呢?因为 Entity Framwework 6 的不同版本有不同的设置和使用方法,按照版本来划分,有三种方法:

  1. EF6 方法
  2. EF6.1.x 方法
  3. EF6.2.x 方法

EF6

EF6 中设置索引比较麻烦,我们需要先进行 code first 迁移,然后在迁移类中的 Up 方法中输入如下代码:

// 创建索引且值唯一
CreateIndex("dbo.User","Name",unique:true);
// 创建复合索引,索引名称为 **NameAndIdNumber**
CreateIndex("dbo.User",new []{"Name","IdNumber"},name:"NameAndIdNumber");

Down 方法中输入如下代码:

DropIndex("dbo.User","Name");
DropIndex("dbo.User",new []{"Name","IdNumber"});

注:EF6 中通过迁移类创建的索引无法重命名

EF6.1.x

该版本定义索引的方法如下:

public virtual void OnModelCreating(DbModelBuilder modelBuilder)
{modelBuilder.Entity<User>().Property(p => p.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()
    {IsUnique=true}));
}

上面这段代码的意思是,给 User 表创建一个唯一索引 Name。同样上面的代码也可以单独定义在一个类中:

public class UserMap : EntityTypeConfiguration<User>
{public UserMap()
  {Property(p => p.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() {IsUnique=true}));
  }
}

我们前面知道在 EF6 中创建的索引无法重命名,那么在 EF6.1.x 中创建的索引是否可以重命名吗?答案是当然可以,我们只需在前一类中的 UpDown 方法写入如下代码即可:

public override void Up()
{RenameIndex(table:"db.User",name:"Name",newName:"NameIndex");
}

public override void Down()
{RenameIndex(table:"db.User",name:"NameIndex",newName:"Name");
}

EF6.2.x

在 EF6.2.X 中创建索引比较简单,只需要调用 HasIndex 方法即可。

public class UserMap : EntityTypeConfiguration<User>
{public UserMap()
    {HasIndex(p=>p.Name);
        // 创建复合索引
        HasIndex(p=>new {
          Name=p.Name,
          IdNumber=p.IdNumber
        });
    }
}

正文完
 0