如何阻止 EF Core 在可为空的列上创建筛选索引

Posted

技术标签:

【中文标题】如何阻止 EF Core 在可为空的列上创建筛选索引【英文标题】:How can I stop EF Core from creating a filtered index on a nullable column 【发布时间】:2018-06-10 07:57:59 【问题描述】:

我有这个模型:

public class Subject

    public int Id  get; set; 

    [Required]
    [StringLength(50)]
    public string Name  get; set; 

    public int LevelId  get; set; 

    [ForeignKey("LevelId")]
    public Level Level  get; set; 

    [Column(TypeName = "datetime2")]
    public DateTime? DeletedAt  get; set; 

并通过 Fluent API 配置索引:

entityBuilder.HasIndex(e => new  e.LevelId, e.Name, e.DeletedAt )
    .IsUnique();

它正在创建一个具有唯一过滤索引的表。如何防止 EF 添加过滤器?我只想要索引而不希望它被过滤。

【问题讨论】:

【参考方案1】:

创建不包括 NULL 值的过滤索引是包含可为空列的唯一索引的默认 EF Core 行为。

您可以使用HasFilter fluent API 更改过滤条件或通过将null 作为sql 参数将其关闭:

entityBuilder.HasIndex(e => new  e.LevelId, e.Name, e.DeletedAt )
    .IsUnique()
    .HasFilter(null);

【讨论】:

注意.HasFilter(null)必须出现在.IsUnique()之后,否则仍然会生成过滤器。

以上是关于如何阻止 EF Core 在可为空的列上创建筛选索引的主要内容,如果未能解决你的问题,请参考以下文章

代码首先为必填字段生成可为空的列

在可为空的十进制属性上使用 Math.Abs

如何使用可为空的列连接 MySQL 表?

在 PySpark 数据框中添加可为空的列

将可为空的列作为参数传递给 Spark SQL UDF

在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null