如何在实体框架中使用Where子句创建唯一索引

des*_*ien 2 entity-framework ef-code-first

我想使用实体框架创建具有WHERE条件的UNIQUE INDEX。

public class Person {
    public string Name { get; set; }    

    public bool Expired { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

条件是,仅当“ Expired”为假时,名称才是唯一的。

INDEX看起来像这样:

CREATE UNIQUE INDEX [IX_Person]
    ON Person(Name)
    WHERE [Expired] = 0;
Run Code Online (Sandbox Code Playgroud)

是否有某种方法可以使用代码优先的方式编写此唯一索引,而不必在迁移中执行此SQL?

我可以这样写:

[Index("IX_Expired", IsUnique = true)]
public bool Expired { get; set; } 
Run Code Online (Sandbox Code Playgroud)

但是我找不到指定“ WHERE”部分的方法。

Dav*_*oft 6

是否有某种方法可以使用代码优先的方式编写此唯一索引,而不必在迁移中执行此SQL?

不可以。EF只能创建基本索引。

SQL Server的EG,筛选索引,具有包含列的索引,分区索引,特定文件组上的索引,具有行或页面压缩的索引,列存储索引,堆表,内存优化表等只能使用TSQL创建。


小智 5

如果有人来这里希望在 Entity Framework 核心中做到这一点......你现在可以做到

例如在您的 MigrationContext 中:

   builder.Entity<MyEntity>()
        .HasIndex(x => x.MyField)
        .HasFilter($"{nameof(MyEntity.MyField)} IS NOT NULL")
        .IsUnique();
Run Code Online (Sandbox Code Playgroud)