[英]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 升級的情況,這是一個已知問題。
幸運的是,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" />
確保您沒有同時使用HasMaxLength和MaxLengthAttribute / 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.