EF Core:在同一列上创建多个过滤索引

时间:2019-09-25 04:08:51

标签: c# sql-server ef-core-2.2

EF Core是否有理由不允许您在同一列上创建多个索引?

new string(' ', 10)

以上只是我正在尝试做的一个示例。 EF Core将不会生成两个索引。取而代之的是,它只为第一个索引生成一个索引,然后我必须手动编辑迁移脚本以获取第二个索引。

这不是SQL抱怨的吗?

1 个答案:

答案 0 :(得分:0)

我对您的要求非常相似-相同属性上的两个索引,但过滤器不同。我刚刚发现Entity Framework Core使用索引属性作为索引标识符的困难方式。 the documentation在创建索引时对此进行了确认:

EF Core每组不同的属性仅支持一个索引。如果您使用Fluent API通过约定或先前的配置在一组已经定义了索引的属性上配置索引,那么您将更改该索引的定义。如果您要进一步配置由约定创建的索引,这将很有用。

通过手动将第一个索引重新添加到模型快照,迁移和迁移的快照中,可以 绕过此行为。这就是我们采取的路线,一切都按预期进行。但是,每次生成后续迁移时,它都会删除第一个索引,我们必须继续手动将其重新添加。如果我们可以使用名称作为索引的唯一标识符,而不是使用索引属性列表,那就太好了。

顺便说一句,在您发布的示例中,您可以使用IN()运算符并创建以下单个索引来涵盖这两种情况:

builder
    .ForSqlServerHasIndex(x => x.ColumnX)
    .ForSqlServerInclude(nameof(TableA.ColumnA), nameof(TableA.ColumnB))
    .HasFilter($"{nameof(TableA.ColumnX)} IN (1, 2) AND {nameof(TableA.IsDeleted)} = 0");