【问题标题】:Max length not applied in migration迁移中未应用的最大长度
【发布时间】:2017-03-16 06:42:23
【问题描述】:

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

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

为什么只有在我更改可空值时才会这样做?

【问题讨论】:

  • 您是如何生成迁移的?
  • dotnet ef 迁移添加 ...
  • 使用[MaxLength] 带或不带[Required] 应该强制字符串属性的最大长度。您使用的是什么提供商?另外,能否给出模型的代码示例?
  • 我在使用 EF 6.1.3 时遇到了同样的问题

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


【解决方案1】:

我相信您需要使用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

【讨论】:

    【解决方案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" />
    

    【讨论】:

    • @ChristopherHarris 属性本身不做任何事情。您可以应用 EF Core 不知道的命名空间中的属性,它会很乐意忽略它。
    • @ChristopherHarris 这是我测试过的工具版本:&lt;package id="Microsoft.EntityFrameworkCore.Tools" version="1.0.0-preview2-final" targetFramework="net461" developmentDependency="true" /&gt;
    • 好的 - 我刚刚意识到这是问题github.com/aspnet/Announcements/issues/195 在我最初的迁移中,长度隐藏在代码后面并设置为 100,因此迁移构建器认为没有任何改变 - 但 db 字段具有 nvarchar (最大)就可以了,因为最新版本不使用该代码。
    • @CodeCaster 原始帖子没有包含该内容,仅在我发表评论后添加。很抱歉造成混乱。
    • @Chris 我现在看到了,应该注意到了。感谢您的澄清!
    【解决方案3】:

    确保您没有同时使用 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);
            }
        }
    

    使用此参数迁移将为标题生成 maxLength = 20

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

    【讨论】:

      猜你喜欢
      • 2022-10-20
      • 2016-04-15
      • 1970-01-01
      • 2018-12-20
      • 2018-02-25
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多