强制Entity Framework 6 (EF6)使用nvarchar(MAX)。

7

我觉得这会很容易,但是...

如何强制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。
3个回答

17
如果您没有指定长度,则 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 Annotations以及Column Annotations


你说得对。我正在使用sp_columns检查我的表模式,它返回ntext而不是nvarchar,所以我认为它没有正确定义列。谢谢。 - Sean
2
你应该在数据库模型上使用[MaxLength(100)]而不是StringLengthStringLength用于视图模型上的数据验证。(是的,我知道,在这里它们都适用于string)好吧,StringLength对于byte[]无效,只有MaxLengthMinLength有效。此外,如果您在视图模型验证中使用StringLength,您可能会将数据库模型用于视图中,这是一种不良设计。 - Matthias Burger

4

以下是在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);
    }

1

不必在每个地方都输入它,您还可以将其默认设置为所需长度。 在您的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");
        }
    }
}

1
我尝试过这个,但是在modelBuilder中没有Model;显然这只适用于.Net Core。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接