最大长度未在迁移中应用

时间:2016-11-02 19:55:22

标签: c# sql-server entity-framework-core

我正在使用带有preview2工具的efcore.sqlserver 1.0.1 - 我有一个字符串属性,它在sql server中创建为nvchar(max)字段。当我向属性添加数据注释stringlength(100)并添加新迁移时,迁移根本不会改变列。

但是,如果我添加一个Required和StringLength注释,那么生成的迁移会改变列并显示(.. maxLength:100,nullable:false)

为什么只有在我改变可以为空的值时才这样做?

3 个答案:

答案 0 :(得分:6)

我认为您需要使用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

答案 1 :(得分:2)

幸运的是,EF核心上没有这样的问题:)我已经测试了你的场景,它运行正常。

您必须使用[MaxLength(100)]属性。这是文档:MaxLength Data Annotations

测试案例我将MaxLength用作测试的500。

首先,我创建了一个这样的属性:

 public string Title { get; set; }

迁移后:

enter image description here

之后我改变了它:

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

迁移后:

enter image description here

生成的脚本:

  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)
                });