Sql server 强制实体框架6(EF6)使用nvarchar(最大值)

Sql server 强制实体框架6(EF6)使用nvarchar(最大值),sql-server,entity-framework,ef-code-first,Sql Server,Entity Framework,Ef Code First,我以为这很容易,但是 如何强制EF6使用nvarchar(MAX) 我试过: [Column(TypeName = "nvarchar(MAX)")] 及 及 modelBuilder.Entity().Property(o=>o.test).HasColumnType(“nvarchar(MAX)”); 我使用的是EF6.2.0和SQL2014 Express如果未指定长度,则EF代码首先默认为nvarchar(max),因此如果指定名称列: public string Name { ge

我以为这很容易,但是

如何强制EF6使用
nvarchar(MAX)

我试过:

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

modelBuilder.Entity().Property(o=>o.test).HasColumnType(“nvarchar(MAX)”);

我使用的是EF6.2.0和SQL2014 Express

如果未指定长度,则EF代码首先默认为nvarchar(max),因此如果指定名称列:

public string Name { get; set; }
您将获得一个nvarchar(max)列

如果需要指定长度,例如100个字符,则可以在代码中指定该列:

[StringLength(50)]
public string Name { get; set; }
如果需要指定varchar而不是nvarchar,则可以使用:

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

请参见和

您也可以将其默认设置为所需的长度,而不是在任何地方键入。 重写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");
        }
    }
}

你说得对。我使用sp_columns检查我的表模式,它返回
ntext
而不是
nvarchar
,因此我认为它没有正确定义列。谢谢您应该在数据库模型上使用
[MaxLength(100)]
,而不是
StringLength
<代码>字符串长度用于视图模型上的数据验证。(是的,我知道,它们在这里对
string
)嗯,
StringLength
byte[]
不起作用,只是
MaxLength
MinLength
。另外,如果您使用
StringLength
,这也适用于viewmodel验证,那么您可能会在视图中使用数据库模型,这是一个糟糕的设计。我尝试过这个方法,但是
modelBuilder
中没有
Model
;显然,这只适用于.NETCore。
[Column(TypeName = "VARCHAR")]
[StringLength(50)]
public string Name { get; set; }
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");
        }
    }
}