【问题标题】:Why EF Core 3.1 StringLength Attribute doubles SQL column length为什么 EF Core 3.1 StringLength 属性加倍 SQL 列长度
【发布时间】:2020-10-09 15:37:59
【问题描述】:

我正在使用 EF 核心 3.1 代码优先方法。当我为数据模型参数指定[StringLength(51)] 时,等效的SQL 列长度指定为nvarchar(102)。为什么会翻倍? 我应该怎么做才能在 SQL 列中获得相同的最大长度?

注意:MS SQL Server 是我的后端。

【问题讨论】:

  • 您确定查看的是字符串长度而不是数据大小吗?数据大小应为 102,因为每个字符占用 1 个字节。
  • @Igor 那么,您的意思是 SQL 中的字符长度仍为 51,数据大小为 102,因为每个字符占用 2 个字节,对吧?
  • @Igor SQL 表模式中的 Length 参数显示为 102

标签: sql-server .net-core string-length nvarchar ef-core-3.1


【解决方案1】:

我认为你可以使用

[MaxLength(51)] // nvarchar(51)
public string Email{ get; set; }

【讨论】:

  • 我需要 Nvarchar 类型。当我指定 nvarchar 时 - 不允许迁移。
  • for nvarchar - StringLength 不需要指定,但是 SQL 中的长度仍然是 102,是 [Column(TypeName = "NVARCHAR(51)")] 值的两倍
  • 你试过没有StringLength的Column(TypeName = "nvarchar(MAX)")]
  • 我需要该列的固定大小。默认值本身是 nvarchar(max)。
  • 我编辑了我的答案,请检查新代码为 nvarchar 指定一个固定的最大长度,您应该使用 MaxLength 而不是 StringLength
【解决方案2】:

感谢@Igor 的评论。我的错,它在 SQL 中也有相同的长度。加倍是以字节为单位的大小,对于每个字符来说,它是两个字节。以下查询有助于理解它,因此将其发布为对像我这样的人有帮助的答案。

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH       
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='Table_Name'```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多