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

Posted

技术标签:

【中文标题】将 EF6 Code First 字符串流畅地设置为 nvarchar(max)【英文标题】:Set EF6 Code First strings fluently to nvarchar(max) 【发布时间】:2015-12-16 05:43:01 【问题描述】:

我正在使用 fluent 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) 的特定字符串属性。

我应该在 fluent 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 【参考方案1】:

我不知道您现在是否找到了答案,但如果其他人想知道该怎么做,只需设置 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)。

【讨论】:

【参考方案2】:

如果您在 EntityTypeConfiguration&lt;MyEntity&gt; 类中执行此操作,它类似于 @RickNo 的答案,但这样做是这样的:

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

【讨论】:

【参考方案3】:

有一种方法表明你使用数据库允许的最大值。

IsMaxLength ()

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

【讨论】:

【参考方案4】:

你可以使用 HasColumnType

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

【讨论】:

以上是关于将 EF6 Code First 字符串流畅地设置为 nvarchar(max)的主要内容,如果未能解决你的问题,请参考以下文章

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列

如何在EF6 Code First中创建与枚举对应的表?

ef6 code first

MVC 5 的 EF6 Code First 入门

MVC5与EF6 Code First 第一个入门完整实例教程

使用 EF6(和 Code First 迁移)针对不同的数据库系统