在我们现有的项目(使用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软件包才能获得正确的扩展方法?还是有其他方法来获取和设置提供者特定的索引名称?
答案 0 :(得分:2)
EF Core 3.0仍在预览中,因此很多东西没有记录是正常的。
但是,基于Metadata API changes和Provider-specific Metadata API changes,方向似乎是删除常见的Relational()
扩展名(以及提供商特定的扩展名,例如Npgsql()
),并且将属性替换为Get
/ Set
扩展方法。
因此相关代码应变为
index.SetName(GetCustomIndexName(index.GetName(), entityType));
还有一种新的GetDefaultName()
方法可以处理包括索引在内的许多事情。
答案 1 :(得分:1)
感谢您试用预发行版,因为您已经注意到事情在不断变化,而且还不稳定!
我目前正在积极地将Npgsql EF提供程序移植到Preview7(即将发布),并且特别致力于元数据访问器。因此,我建议再等一周左右,然后切换到Preview7。