如何使用 ASP.net EF Codefirst 数据注释将 SQL Server 中的列设置为 varchar(max)?

问题描述 投票:0回答:6

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

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

我尝试过[MaxLength]但没有成功。

如有任何帮助,我们将不胜感激。谢谢!

[Column(TypeName = "varchar")]
public string MediaDesc { get; set; }
c# sql-server entity-framework ef-code-first
6个回答
92
投票
[Column(TypeName = "varchar(MAX)")]

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

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


21
投票

这会让你

nvarchar(max)

[StringLength(int.MaxValue)]

我不认为有一个属性可以强制使用非 unicode(你确定要这样吗?),所以对于

varchar(max)
,你需要在 DbContext 中进行调整:

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

4
投票

使用[MaxLength]注释。

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

3
投票

更新@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);

0
投票

[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 个字符的错误。


0
投票

在 8.0.6 版本的

entity framework
中,字符串数据类型的默认值为
nvarchar(max)
。您可以这样描述您的财产:
entity.Property(e => e.Notes);

我为我的一个项目做了这个,它有效

© www.soinside.com 2019 - 2024. All rights reserved.