Entity Framwework 6 设置和使用索引,是一个比较 egg 疼的事情,为什么这么说呢?因为Entity Framwework 6的不同版本有不同的设置和使用方法,按照版本来划分,有三种方法:
- EF6 方法
- EF6.1.x方法
- EF6.2.x方法
EF6
EF6中设置索引比较麻烦,我们需要先进行code first 迁移,然后在迁移类中的 Up 方法中输入如下代码:
代码语言:javascript复制//创建索引且值唯一
CreateIndex("dbo.User","Name",unique:true);
//创建复合索引,索引名称为 **NameAndIdNumber**
CreateIndex("dbo.User",new []{"Name","IdNumber"},name:"NameAndIdNumber");
在 Down 方法中输入如下代码:
代码语言:javascript复制DropIndex("dbo.User","Name");
DropIndex("dbo.User",new []{"Name","IdNumber"});
注:EF6中通过迁移类创建的索引无法重命名
EF6.1.x
该版本定义索引的方法如下:
代码语言:javascript复制public virtual void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Property(p => p.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()
{
IsUnique=true
}));
}
上面这段代码的意思是,给User表创建一个唯一索引Name。同样上面的代码也可以单独定义在一个类中:
代码语言:javascript复制public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
Property(p => p.Name).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() {
IsUnique=true
}));
}
}
我们前面知道在EF6中创建的索引无法重命名,那么在EF6.1.x中创建的索引是否可以重命名吗?答案是当然可以,我们只需在前一类中的 Up 和 Down 方法写入如下代码即可:
代码语言:javascript复制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 方法即可。
代码语言:javascript复制public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
HasIndex(p=>p.Name);
//创建复合索引
HasIndex(p=>new {
Name=p.Name,
IdNumber=p.IdNumber
});
}
}