我正在使用带有preview2工具的efcore.sqlserver 1.0.1 - 我有一个字符串属性,它在sql server中创建为nvchar(max)字段。当我向属性添加数据注释stringlength(100)并添加新迁移时,迁移根本不会改变列。
但是,如果我添加一个Required和StringLength注释,那么生成的迁移会改变列并显示(.. maxLength:100,nullable:false)
为什么只有在我改变可以为空的值时才这样做?
答案 0 :(得分:6)
我认为您需要使用MaxLengthAttribute
代替StringLengthAttribute
。
https://docs.efproject.net/en/latest/modeling/max-length.html#data-annotations
这可能是因为StringLength
属性具有最小长度选项,SQL本身不支持该选项,因此MaxLength
属性更适合此用例。
为了清楚起见,属性本身没有任何影响。它们可以包含逻辑和信息,但必须在正常执行模型中通过另一段代码的反射来使用。除了编译器赋予特殊含义的某些属性之外,例如Conditional
属性。
修改强>
作者发现,对于从RC2 =>升级工具集的情况,这是一个已知问题。 RTM。
答案 1 :(得分:2)
幸运的是,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" />
答案 2 :(得分:0)
确保不要同时使用 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)
});