簡體   English   中英

EF Core 試圖刪除不存在的索引

[英]EF Core trying to drop index that doesn't exist

運行遷移嘗試將列從可為 null 修改為 not-null 時遇到錯誤。 我的 model class 看起來像這樣:

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

    public virtual Sale Sale { get; set; }
}

以前, SaleIdGuid? . 這是 DbContext 中的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");
});

更改類型后,創建了一個新的遷移:

// 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);

這失敗並出現以下情況:

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] 添加默認值 '00000000-0000-0000-0000-000000000000' FOR [SaleId]; 在 [SaleLandNonDeeded] ([SaleId]) 上創建索引 [IX_SaleLandNonDeeded_SaleId]; 拋出的異常:System.Private.CoreLib.dll 中的“Microsoft.Data.SqlClient.SqlException” SqlException' in System.Private.CoreLib.dll System.Private.CoreLib.dll 中出現類型為'Microsoft.Data.SqlClient.SqlException' 的異常,但未在用戶代碼中處理 無法刪除索引'SaleLandNonDeeded.IX_SaleLandNonDeeded_SaleId',因為它不存在或您沒有權限。

model、上下文、遷移或快照中的任何位置都沒有IX_SaleLandNonDeeded_SaleId 對整個解決方案執行 Ctrl+F 后,除上述日志條目外,不會返回任何匹配項。 我不知道為什么 EF Core 試圖刪除並創建這個索引。 我確實在這里發現了一個與此相關的問題: https://github.com/do.net/efcore/issues/7535回到 EF Core 1.0 並已修復關閉。 我正在使用 EF Core 5.0。

絕對不是最干凈的答案,但我和你有同樣的問題,我只是將丟失的索引添加為遷移的第一行:

migrationBuilder.CreateIndex("IX_SaleLandNonDeeded_SaleId", "SaleLandNonDeeded", "SaleId");

不要忘記更新Down()方法:

migrationBuilder.DropIndex("IX_SaleLandNonDeeded_SaleId", "SaleLandNonDeeded");

我已經從 EF 6 升級到 EF core 5.0。 不要問我為什么他們決定改變命名約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM