最大長度未在遷移中應用

c# entity-framework-core sql-server

我正在使用帶有preview2工具的efcore.sqlserver 1.0.1 - 我有一個字符串屬性,它在sql server中創建為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)]屬性。這是doc: MaxLength數據註釋

測試案例:我使用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" />


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因