【问题标题】:How do I set a column in SQL Server to varchar(max) using ASP.net EF Codefirst Data Annotations?如何使用 ASP.net EF Codefirst 数据注释将 SQL Server 中的列设置为 varchar(max)?
【发布时间】:2012-06-29 10:53:48
【问题描述】:

我一直在网上搜索,试图找出正确的语法,让 Entity Framework Code First 使用列创建我的表:varchar(max)。

这就是我所拥有的。默认情况下,这会创建 varchar(128)。如何创建 varchar(max)?

我试过 [MaxLength] 没有成功。

任何帮助将不胜感激。谢谢!

[Column(TypeName = "varchar")]
public string MediaDesc { get; set; }

【问题讨论】:

  • [Column(TypeName = "varchar(MAX)")] 为我工作。但是我得到了一个varchar(8000) 和你的代码sn-p,而不是你说的varchar(128)。奇怪的。您使用的是什么 EF 版本以及什么数据库版本?
  • 谢谢斯劳马。数字我尝试了很多不同的方法,除了最明显的方法。像魅力一样工作!
  • 如果您将此作为答案提交,我将接受。再次感谢!
  • 我真的很惊讶它的工作原理:)(我会把它写成答案......)

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


【解决方案1】:
[Column(TypeName = "varchar(MAX)")]

令人惊讶的是,最明显的解决方案奏效了。

[MaxLength] 属性仅创建一个最大长度不是 MAX 的 varchar 列,但在我的情况下(SQL Server Express 2008 R2)为 8000。

【讨论】:

  • alter column size using database first method:, 我在 sql 中使用它来将大小从 nvarchar(50) 更改为 max: alter table Product alter column WebSite nvarchar(max) null 注意:这不会影响model 属性,但是如果将列名更改为新名称,则会影响模型并出现错误,然后您可以使用选项“从数据库更新模型”或删除 .edmx 文件并重新创建它。希望对某人有所帮助。
  • 对于 MAX 字符串长度,它可以正常工作,但如果您想直接提及特定的字符串长度,那么它就会开始失败。这个 [Column("ToDoItem", TypeName = "nvarchar(2000)")] 将无法正常工作,并且会出现非常神秘的错误而失败,这让您不知道幕后出了什么问题。对于 MAX nvarchar 长度,您无需单独提及 stringLength 属性。我在 EF 6 顺便说一句。
  • 我不得不告诉它列的名称,因为它与我的属性名称不一致:[Column("BUS_UNIT", TypeName="varchar(MAX)")] 即使属性被命名为BusUnit1
【解决方案2】:

这会给你nvarchar(max):

[StringLength(int.MaxValue)]

我认为没有强制非 unicode 的属性(您确定要这样做吗?),因此对于 varchar(max),您需要在 DbContext 中进行调整:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Entity>().Property(x => x.MediaDesc).IsUnicode(false);
}

【讨论】:

  • 您确定int.MaxInt 适用于StringLength 属性吗?我用MaxLength 属性([StringLength(int.MaxInt)]) 尝试了这个,并得到一个异常值不能大于4000。也许它适用于StringLength,但如果是这样,那么这一切都非常令人困惑......跨度>
  • 不知道 MaxLength。我尝试使用 StringLength,它按预期工作。
  • 我刚刚发现与[Column(TypeName = "varchar")]属性的组合是问题所在。如果没有它,MaxLength 和 StringLength 也可以使用。 +1
  • 我认为使用MaxLength 是最惯用的(和简洁的),但StringLength 和MaxLength 都比明确指定列类型名称要好得多,就像公认的答案一样。跨度>
【解决方案3】:

使用 [MaxLength] 注释。

[Column(TypeName = "varchar")]
[MaxLength]
public string MediaDesc { get; set; }

【讨论】:

  • 对我来说,这会创建一个 varchar(8000) 列,而不是 varchar(MAX)。
  • MaxLength 是验证,而不是列定义
【解决方案4】:

@Slauma 答案的更新。

在OnModelCreating 中对所有这样的字符串使用覆盖:

modelBuilder.Properties<string>().Configure(s => 
    s.HasMaxLength(256).HasColumnType("nvarchar"));

然后用这样的属性修改属性:

[Column(TypeName = "nvarchar(MAX)")]
public string CaseComment { get; set; }

或者这个:

modelBuilder.Entity<YourClass>()
    .Property(b => b.CaseComment)
    .HasColumnType("nvarchar(MAX)");

这可能会导致异常。 Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. 即使该列是正确的数据类型实体框架仍然认为它是nvarchar(256) 并抛出错误DbEntityValidationException。

要解决此问题,请改用以下代码:

[Column(TypeName = "nvarchar(MAX)")]
[MaxLength]
public string CaseComment { get; set; }

或者

modelBuilder.Entity<YourClass>()
    .Property(b => b.CaseComment)
    .HasColumnType("nvarchar(MAX)")
    .HasMaxLength(null);

【讨论】:

    【解决方案5】:

    [Column(TypeName = "varchar(MAX)")] 在数据库中产生 varchar(Max)。如果您有自定义约定将字符串 MaxLength 设置为 100,

    modelBuilder
        .Properties<string>()
        .Configure(c => c.IsUnicode(false).HasMaxLength(100));
    

    您需要包含 MaxLength 属性[Column(TypeName = "varchar(MAX)"), MaxLength]。如果不这样做,您将在数据库中获得 varchar(MAX),但验证将抛出超过 100 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2017-01-25
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多