簡體   English   中英

如何首先禁用 EF 遷移代碼默認值生成

[英]How to disable EF Migration code first Default Value generation

我正在使用 EF Core 6 Code First 方法。 當我定義一個帶有必填字段的新實體時,EF 遷移總是為此創建一個空的默認約束,如下所示:

           migrationBuilder.AlterColumn<Guid>(
                name: "TenantId",
                table: "Sites",
                type: "uniqueidentifier",
                nullable: false,
                defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),  // unnecessary default constraint
                oldClrType: typeof(Guid),
                oldType: "uniqueidentifier",
                oldNullable: true);

在大多數情況下,我不想有任何默認值。 我嘗試使用這樣的 model 配置來禁用此行為,但它沒有效果:

  builder.Property(cc => cc.TenantId).HasDefaultValue(null);
  builder.Property(cc => cc.TenantId).HasDefaultValueSql(null);

我正在使用此命令生成遷移:

 dotnet ef migrations add --context:DataContext --project "xxx" xxxx

對於這個特定問題,我找不到關於 SO 的任何問題,但是有很多類似的問題導致一個答案: just update the generated scripts manually

我覺得很奇怪。 到目前為止,我從未手動更新過腳本,我認為手動更新腳本會導致代碼和數據庫架構之間存在差異。 如果腳本中的手動更改是通往 go 的方式,您能否解釋一下為什么這不是問題以及為什么我不應該擔心?

非常感謝!


額外細節:

// Nullable types are not enabled

public class Site
{
    public Tenant Tenant { get; set; }

    public Guid TenantId { get; set; }

    public Guid Id { get; set; }

    ...
}

public class Tenant
{
    public Guid Id { get; set; }

    ...
}

public class SiteEntityTypeConfiguration : IEntityTypeConfiguration<Site>
{
    public void Configure(EntityTypeBuilder<Site> builder)
    {
        builder.HasOne(cc => cc.Tenant)
            .WithMany()
            .OnDelete(DeleteBehavior.Restrict);
    }
}

您不能讓 [Required] 屬性具有默認值 null。 這將違反約束。

如果需要某個屬性,它將在數據庫中標記為 NON NULLable。 所以你不能使用 null 作為默認值。

好吧……你不應該擔心,但也許你應該擔心。

不必擔心手動更改腳本,因為它不會真正影響運行時行為。 默認值僅影響事物的 SQL 端而不影響 POCO 端。

換句話說,如果您創建一個新的 POCO 實例,無論您在數據庫中擁有(或不擁有)默認約束都不會影響該新 POCO 實例中的值。

但是,您應該從代碼維護的角度擔心它,這就是為什么我來到這個線程也是為了尋找一種方法來首先防止創建默認約束。 如果我們有辦法做到這一點,我們可以讓我們的代碼為其他開發人員和我們自己在未來查看它並問“為什么這個列沒有默認約束而所有其他列都有?”時自我記錄。

暫無
暫無

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

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