EF Core 尝试删除不存在的索引

Val*_*tor 10 c# sql-server entity-framework-core

运行迁移尝试将列从可为空修改为非空时遇到错误。我的模型类如下所示:

public class SaleLandNonDeeded
{
    public Guid SaleLandNonDeededId { get; set; }
    public Guid SaleId { get; set; }
    public decimal? TotalValue { get; set; }

    public virtual Sale Sale { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以前,SaleId类型为Guid?。这是以下中的模型配置DbContext

modelBuilder.Entity<SaleLandNonDeeded>(entity =>
{
    entity.Property(e => e.SaleLandNonDeededId).HasDefaultValueSql("(newid())");

    entity.Property(e => e.TotalValue).HasColumnType("money");

    entity.HasOne(d => d.Sale)
        .WithMany(p => p.SaleLandNonDeeded)
        .HasForeignKey(d => d.SaleId)
        .HasConstraintName("FK_SaleLandNonDeeded_SaleId");
});
Run Code Online (Sandbox Code Playgroud)

更改类型后,创建了新的迁移:

// This line was added manually to delete null values before changing
// the column type.
migrationBuilder.Sql("DELETE FROM SaleLandNonDeeded WHERE SaleId IS NULL");

migrationBuilder.AlterColumn<Guid>(
    name: "SaleId",
    table: "SaleLandNonDeeded",
    type: "uniqueidentifier",
    nullable: false,
    defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
    oldClrType: typeof(Guid),
    oldType: "uniqueidentifier",
    oldNullable: true);
Run Code Online (Sandbox Code Playgroud)

失败并出现以下情况:

Microsoft.EntityFrameworkCore.Database.Command:错误:执行 DbCommand 失败(34 毫秒)[Parameters=[]、CommandType='Text'、CommandTimeout='30'] DROP INDEX [IX_SaleLandNonDeeded_SaleId] ON [SaleLandNonDeeded];声明 @var1 系统名;SELECT @var1 = [d].[name] FROM [sys].[default_constraints] [d] INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id] WHERE ([d].[parent_object_id] = OBJECT_ID(N'[SaleLandNonDeeded]') AND [c].[name] = N'SaleId'); IF @var1 IS NOT NULL EXEC(N'ALTER TABLE [SaleLandNonDeeded] DROP CONSTRAINT [' + @var1 + '];'); ALTER TABLE [SaleLandNonDeeded] ALTER COLUMN [SaleId] uniqueidentifier NOT NULL;更改表 [SaleLandNonDeeded] 为 [SaleId] 添加默认值 '00000000-0000-0000-0000-000000000000';在 [SaleLandNonDeeded] ([SaleId]) 上创建索引 [IX_SaleLandNonDeeded_SaleId];抛出异常:System.Private.CoreLib.dll 中的“Microsoft.Data.SqlClient.SqlException” 抛出异常:System.Private.CoreLib.dll 中的“Microsoft.Data.SqlClient.SqlException” 抛出异常:“Microsoft.Data.SqlClient”。 System.Private.CoreLib.dll 中的 SqlException' System.Private.CoreLib.dll 中发生“Microsoft.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理无法删除索引“SaleLandNonDeeded.IX_SaleLandNonDeeded_SaleId”,因为它不存在或您没有权限。

IX_SaleLandNonDeeded_SaleId模型、上下文、迁移或快照中没有任何地方。除上述日志条目外,对整个解决方案执行 Ctrl+F 不会返回任何匹配项。我不知道为什么 EF Core 试图删除并创建此索引。我确实在这里发现了与此相关的问题: https: //github.com/dotnet/efcore/issues/7535,该问题早在 EF Core 1.0 中就已修复并已关闭。我正在使用 EF Core 5.0。

小智 12

绝对不是最干净的答案,但我遇到了与您相同的问题,我只是将丢失的索引添加为迁移的第一行:

migrationBuilder.CreateIndex("IX_SaleLandNonDeeded_SaleId", "SaleLandNonDeeded", "SaleId");
Run Code Online (Sandbox Code Playgroud)

不要忘记还更新该Down()方法:

migrationBuilder.DropIndex("IX_SaleLandNonDeeded_SaleId", "SaleLandNonDeeded");
Run Code Online (Sandbox Code Playgroud)

我已从 EF 6 升级到 EF core 5.0。不要问我为什么他们决定改变命名约定。