【问题标题】:Entity Framework uses nvarchar (max) when MaxLength is specified实体框架在指定 MaxLength 时使用 nvarchar (max)
【发布时间】:2015-08-27 13:06:13
【问题描述】:

我已使用 EF fluent api 将文本字段的 MaxLength 指定为 4096,以限制其长度:

this.Property(p => p.MyText).HasMaxLength(4096).IsRequired();

但由于某种原因在 SQL Server 中,该列变为nvarchar (max)

仅用于测试我是否指定 2048 以确保 SQL Server 得到更新

this.Property(p => p.MyText).HasMaxLength(2048).IsRequired();

这样就行了。

所以我的问题是为什么 EF 在 MaxLength(4096) 时设置 sql nvarchar (max)

【问题讨论】:

  • 只要您的 nvarchar少于 4000 个字符(每个 2 个字节)- SQL Server 将使用 nvarchar(n) 类型。上限为 4000 个字符 - 如果您指定的长度大于该长度,则别无选择,只能使用 nvarchar(max)(最多支持 10 亿 个字符)跨度>
  • @marc_s 这看起来很荒谬(我知道这不是你的错;我只是回应你的评论)。在 4000 和 2^31 - 1 之间有大量的空间。为什么我不能指定 8192 之类的?我想知道是否有技术原因,或者他们只是决定,“如果你需要超过 4000 个(这本身是任意的),那么 max 就必须这样做”。
  • @AriRoth:SQL Server 中的物理存储以 8K(8192 字节)的 组织。由于nvarchar 总是每个字符使用 2 个字节,并且每个页面都有几个标题字节,因此您基本上在单个页面上获得 8000 个字节(或 4000 个nvarchar 字符) - 最多。因此,“正常”nvarchar(n) 被限制为最大值。 4000 个字符(非 Unicode varchar(n) 限制为 8000 个字符)。如果您需要更多,那么您可以通过使用 8K 页面存储所有数据的非常精细(和复杂)的结构获得总共 2 GB 的存储空间
  • @marc_s 哦,是的,我忘记了 8k 页面大小。对我来说,nvarchar 基本上说“您可以将字段大小限制为 8k,但之后您将不得不使用 max”,这对我来说似乎很奇怪。我的意思是,这似乎是一个可以解决的问题,我想在很多情况下,您希望将字段大小限制为超过 4000 个字符且小于最大值。但我不是数据库管理员或其他任何人,所以它可能不像我认为的那样可解决。 :)

标签: c# sql-server entity-framework entity-framework-6


【解决方案1】:

我认为这是 SQL Server 的限制。 msdn

可变长度的 Unicode 字符串数据。 n 定义字符串长度,可以是从 1 到 4,000 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多