IMutableIndex.Npgsql() 方法的 EF Core 3.0 替换

EF Core 3.0 replacement for IMutableIndex.Npgsql() method

在我们现有的项目(使用 Entity Framework Core 2.2 和 Npgsql)中,我们的数据库上下文中有以下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...
    var entityTypes = modelBuilder.Model.GetEntityTypes().Where(x => !x.IsQueryType);
    foreach (var entityType in entityTypes)
    {
        var indexes = entityType.GetIndexes();

        foreach (var index in indexes)
        {
            index.Npgsql().Name = GetCustomIndexName(index.Npgsql().Name, entityType);
        }
    }
    ...
}

迁移到 .NET Core 3.0 时,有很多重大更改。其中之一是 属性 IsQueryType。在this part of documentation的基础上,我把属性改成了IsKeyless,应该是等价的。

但是,由于文档非常稀少,有时甚至根本不存在,我很难弄清楚用什么来代替 index.Npgsql().Name。 Visual Studio 在 Npgsql() 扩展方法下显示一条错误消息,说 Reference to type 'RelationalKeyAnnotations' claims it is defined in 'Microsoft.EntityFrameworkCore.Relational',但它不能找到

根据另一个 piece of documentation,我认为正确的等价物是 index.GetNpgsqlName(),但似乎不存在这样的方法。我是否需要安装任何额外的 Nuget 包才能获得正确的扩展方法?或者是否有不同的方法来获取和设置特定于提供者的索引名称?

感谢您试用预发布版本,因为您已经注意到事情在不断变化,并不完全稳定!

我目前正在积极致力于将 Npgsql EF 提供程序移植到预览版 7(即将发布),并且专门从事元数据访问器方面的工作。所以我建议再等一周左右,然后切换到预览版 7。

EF Core 3.0 仍处于预览阶段,因此有很多未记录的内容是正常的。

但是,基于 Metadata API changes and Provider-specific Metadata API changes,方向似乎是删除常见的 Relational() 扩展(以及提供商特定的扩展,如 Npgsql()),并将属性替换为Get / Set 扩展方法。

所以有问题的代码应该变成

index.SetName(GetCustomIndexName(index.GetName(), entityType));

还有一个新的 GetDefaultName() 方法可以处理一些事情,包括索引,这可能很有用。