【问题标题】:Force Entity Framework 6 (EF6) to use nvarchar(MAX)强制实体框架 6 (EF6) 使用 nvarchar(MAX)
【发布时间】:2018-01-04 09:39:46
【问题描述】:

我认为这很容易,但是...

如何强制 EF6 使用nvarchar(MAX)

我试过了:

[Column(TypeName = "nvarchar(MAX)")]

[Column(TypeName = "nvarchar")]
[MaxLength()]

modelBuilder.Entity<Date>().Property(o => o.test).HasColumnType("nvarchar(MAX)");

我正在使用 EF6.2.0 和 SQL2014 Express

【问题讨论】:

    标签: sql-server entity-framework ef-code-first


    【解决方案1】:

    如果不指定长度,则 EF Code First 默认为 nvarchar(max),因此如果指定 Name 列:

    public string Name { get; set; }
    

    你会得到一个 nvarchar(max) 列。

    如果您需要指定长度,比如 100 个字符,那么您可以在代码中指定列:

    [MaxLength(50)]
    public string Name { get; set; }
    

    如果您需要指定 varchar 而不是 nvarchar,您可以使用:

    [Column(TypeName = "VARCHAR")]
    [MaxLength(50)]
    public string Name { get; set; }
    

    Code First ConventionsCode First Data AnnotationsColumn Annotations

    【讨论】:

    • 你是对的。我正在使用 sp_columns 检查我的表架构,它返回 ntext 而不是 nvarchar,所以我认为它没有正确定义列。谢谢
    • 您应该在数据库模型上使用[MaxLength(100)] 而不是StringLengthStringLength 用于视图模型上的数据验证。 (是的,我知道,他们在这里与string 一起工作)好吧,StringLength 不适用于byte[],只有MaxLengthMinLength。另外,如果你使用StringLength,它也适用于视图模型验证,你可能会在视图中使用数据库模型,这是一个糟糕的设计。
    【解决方案2】:

    这在 Entity Framework Core 5 中对我有用

    [Column(TypeName = "nvarchar(MAX)")]
    [MaxLength(int.MaxValue)]
    public string ImageBase64 { get; set; }
    

    生成以下迁移:

    migrationBuilder.AlterColumn<string>(
        name: "ImageBase64",
        table: "Medias",
        type: "nvarchar(MAX)",
        maxLength: 2147483647,
        nullable: true,
        oldClrType: typeof(string),
        oldType: "nvarchar(450)",
        oldMaxLength: 450,
        oldNullable: true);
    

    需要MaxLength,因为我们修改了 OnModelCreating 以避免所有字符串列使用nvarchar(MAX)

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        foreach (var property in modelBuilder.Model.GetEntityTypes()
            .SelectMany(t => t.GetProperties())
            .Where(p => p.ClrType == typeof(string)))
        {
            if (property.GetMaxLength() == null)
                property.SetMaxLength(450);
        }
    

    【讨论】:

      【解决方案3】:

      您也可以将其默认设置为所需的长度,而不是在任何地方输入。 覆盖 dbcontext 类中的函数 OnModelCreating

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          foreach (var property in modelBuilder.Model.GetEntityTypes()
              .SelectMany(t => t.GetProperties()).Where(p => p.ClrType == typeof(string)))
          {
              if (property.GetMaxLength() == null)
              {
                  property.SetMaxLength(256);
              }
      
              if (string.IsNullOrEmpty(property.GetColumnType()))
              {
                  property.SetColumnType("varchar");
              }
          }
      }
      

      【讨论】:

      • 我试过了,但是modelBuilder里面没有Model;显然这仅适用于 .Net Core。
      猜你喜欢
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2017-10-19
      • 2014-03-02
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多