Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架在指定MaxLength时使用nvarchar(max)_C#_Sql Server_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架在指定MaxLength时使用nvarchar(max)

C# 实体框架在指定MaxLength时使用nvarchar(max),c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,我已使用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 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设置sql
nvarchar(max)
MaxLength(4096)
时,我认为这是sql Server的限制。说

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


只要您的
nvarchar
列少于4000个字符(每个2字节),SQL Server将使用
nvarchar(n)
类型。上限为4000个字符-如果您指定的长度大于该长度,那么除了使用
nvarchar(max)
(最多支持10亿个字符)@marc_,这似乎很可笑(我知道这不是您的错;我只是回应您的评论)。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页面存储所有这些内容的非常复杂的结构,您总共可以获得2GB的存储空间data@marc_s哦,是的,我忘了8k的页面大小。我觉得很奇怪,nvarchar基本上说“你可以将字段大小限制在8k,但在那之后你只能使用max”。我的意思是,这似乎是一个可以解决的问题,我想在很多情况下,您可能希望将字段大小限制在4000个字符以上,小于最大值。但我不是DB管理员或其他任何人,因此可能它不像我认为的那样可以解决。:)