EF Core 3.0替代IMutableIndex.Npgsql()方法

时间:2019-07-17 09:41:31

标签: c# entity-framework .net-core npgsql .net-core-3.0

在我们现有的项目(使用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()扩展方法下显示一条错误消息,说对类型'RelationalKeyAnnotations'的引用声称它是在'Microsoft.EntityFrameworkCore.Relational'中定义的,但找不到它

基于另一个piece of documentation,我认为正确的等效项是index.GetNpgsqlName(),但似乎不存在这样的方法。我是否需要安装任何其他Nuget软件包才能获得正确的扩展方法?还是有其他方法来获取和设置提供者特定的索引名称?

2 个答案:

答案 0 :(得分:2)

EF Core 3.0仍在预览中,因此很多东西没有记录是正常的。

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

因此相关代码应变为

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

还有一种新的GetDefaultName()方法可以处理包括索引在内的许多事情。

答案 1 :(得分:1)

感谢您试用预发行版,因为您已经注意到事情在不断变化,而且还不稳定!

我目前正在积极地将Npgsql EF提供程序移植到Preview7(即将发布),并且特别致力于元数据访问器。因此,我建议再等一周左右,然后切换到Preview7。