将EF6 Code First字符串流畅地设置为nvarchar(max)。

25

我正在使用流畅API构建一个EF6的代码优先模型。据我所知,默认情况下,字符串将是nvarchar(max),这(直白地说)对于默认值来说是愚蠢的。因此,我添加了以下约定代码,将最大默认长度设置为255个字符:

modelBuilder.Properties<string>()
    .Configure(p => p.HasMaxLength(255));

然后我创建了一个装饰器,代码如下:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TextAttribute : Attribute
{
}

我想将其应用于我实际希望为NVARCHAR(MAX)的特定字符串属性。

在流畅API中,我应该放什么以确保所有具有[Text]修饰符的字符串属性都在数据库中以NVARCHAR(MAX)构建? 我假设它会像这样:

modelBuilder.Properties<string>()
    .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
    .Configure(p => p.HasMaxLength(?????));

或者说我完全做错了吗?


使用实际的nvarchar(max)长度限制是错误的吗?2^30-1 - TigOldBitties
6个回答

29

我不知道你是否已经找到了答案,但如果有人想知道如何做到这一点,只需设置SQL数据类型并忽略HasMaxLength()调用即可。

        modelBuilder.Properties<string>()
            .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
            .Configure(p => p.HasColumnType("nvarchar(max)"));

使用IsMaxLength()或HasMaxLength(null)会将字段设置为nvarchar(4000)(如果指定数据类型为varchar,则为varchar(8000))。


17

如果你是在 EntityTypeConfiguration<MyEntity> 类中进行操作,那么它与 @RickNo 的回答类似,但应该这样做:

Property(x => x.MyVarcharMaxProperty)
    .HasColumnType("nvarchar(max)");

8

有一种方法可以指示您使用数据库允许的最大值。

IsMaxLength()

    modelBuilder.Properties<string>()
        .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
        .Configure(p => p.HasColumnType("nvarchar").IsMaxLength());

3

您可以使用 HasColumnType

enter image description here

或者您可以不使用任何HasColumnTypeHasMaxLength。没有必要使用HasMaxLength

enter image description here


1

在 EF Core 7 中对我有效

entity.Property(e => e.ColumnName)
    .HasMaxLength(int.MaxValue);

你的示例是针对VARCHAR(MAX)的。对于NVARCHAR(MAX),你需要与 .IsUnicode(true) 结合使用。请查看我的答案以获取详细信息。 - TotPeRo

1

如果您使用的数据库提供程序不是 MS SQL Server,那么列类型可能与 NVARCHAR 不同,因此您需要使用 HasMaxLengthIsUnicode 结合使用。

如果您使用:

builder.Property(e => e.ColumnName)
        .HasColumnType("nvarchar(max)");

这是针对 MS SQL Server 数据库提供程序硬编码的,如果您想在将来切换到其他提供程序,则需要更改所有实体配置以及更改迁移。

例如 PostgreSql:PostgreSQL 相当于 SQL Server NVARCHAR (MAX)MySQL 中的 SQL Server NVARCHAR(max) 等效是什么?

您可以使用 NVARCHAR(MAX)

builder.Property(e => e.ColumnName)
    .HasMaxLength(int.MaxValue)
    .IsUnicode(true);

您可以使用 VARCHAR(MAX)

builder.Property(e => e.ColumnName)
    .HasMaxLength(int.MaxValue)
    .IsUnicode(false);

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