簡體   English   中英

遷移中未應用的最大長度

[英]Max length not applied in migration

我將 efcore.sqlserver 1.0.1 與 preview2 工具一起使用 - 我有一個字符串屬性,它在 sql 服務器中創建為 nvchar(max) 字段。 當我向屬性添加數據注釋 stringlength(100) 並添加新的遷移時,遷移根本不會改變列。

但是,如果我添加 Required 和 StringLength 注釋,則生成的遷移會更改列並顯示 (.. maxLength: 100, nullable: false )

為什么它只在我更改可空值時才執行此操作?

我相信您需要使用MaxLengthAttribute而不是StringLengthAttribute

https://docs.efproject.net/en/latest/modeling/max-length.html#data-annotations

這可能是因為StringLength屬性具有最小長度選項,SQL 本身不支持該選項,因此MaxLength屬性更適合此用例。

需要明確的是,屬性本身沒有任何影響。 它們可以包含邏輯和信息,但在正常執行模型期間必須通過來自另一段代碼的反射來使用。 這是由編譯器賦予特殊含義的某些屬性的例外,例如Conditional屬性。

編輯

作者發現,對於工具集從 RC2 => RTM 升級的情況,這是一個已知問題。

https://github.com/aspnet/Announcements/issues/195

幸運的是,EF 核心上沒有這樣的問題:) 我已經測試了你的場景並且它工作正常。

您必須為此使用[MaxLength(100)]屬性。這是文檔: MaxLength Data Annotations

測試用例:我使用 MaxLength 作為 500 進行測試。

首先,我創建了一個這樣的屬性:

 public string Title { get; set; }

遷移后:

在此處輸入圖片說明

在那之后,我改變了它:

 [MaxLength(500)]
 public string Title { get; set; }

遷移后:

在此處輸入圖片說明

生成的腳本:

  migrationBuilder.AlterColumn<string>(
                name: "Title",
                table: "Posts",
                maxLength: 500,
                nullable: true);

測試工具版本:

 <package id="Microsoft.EntityFrameworkCore.Tools"
 version="1.0.0-preview2-final" targetFramework="net461"
 developmentDependency="true" />

確保您沒有同時使用HasMaxLengthMaxLengthAttribute / StringLength ,因為數據庫 Configure() HasMaxLength優先於MaxLengthAttribute 觀看下面的代碼示例

柱模型

[MaxLength(500)]
public string Title { get; set; }

配置

  public class TableNameConfiguration : IEntityTypeConfiguration<TableName>
    {
        public void Configure(EntityTypeBuilder<TableName> builder)
        {
           //.HasMaxLength takes precedence over operation MaxLengthAttribute(500)
           builder.Property(x => x.Title ).IsRequired().HasMaxLength(20);
        }
    }

使用此參數遷移將為 Title 生成 maxLength = 20

 migrationBuilder.CreateTable(
                name: "TableName",
                columns: table => new
                {
                    Title= table.Column<string>(maxLength: 20, nullable: true)
                });

當我首先使用 EF Core 代碼時,我遇到了這個問題。 我將遷移代碼entity.Property(t => t.UserName).HasColumnType("varchar").HasMaxLength(256)更改為entity.Property(t => t.UserName).HasColumnType("varchar(256)")現在它工作正常。

暫無
暫無

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

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