将 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<MyEntity>
类中执行此操作,它类似于 @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系列