默认情况下,EF 4.2 codefirst将字符串属性后面的数据库列设置为nvarchar(max)。
单独(每个属性)我可以通过指定[MaxLength(512)]
属性来覆盖此约定。
有没有办法全局应用这样做的配置?似乎模型构建器上的配置api仅允许每个实体覆盖,并且模型构建器上的约定api仅允许删除。请参阅此question。
答案 0 :(得分:3)
没有可用的全局配置。自定义约定已在CTP阶段从EF Code First中删除。
答案 1 :(得分:2)
我认为你可以做到这一点。在模型表的属性上方添加StringLength属性。就像下面一样。 (请记住,您需要使用System.ComponentModel.DataAnnotations;)
[StringLength(160)]
public string Title { get; set; }
<强>更新强>
首先,您无法在nvarchar(MAX)列上创建索引。您可以使用全文索引,但无法在列上创建索引以提高查询性能。
从存储角度来看,当n <1时,nvarchar(max)和nvarchar(N)之间没有区别。 4000.当不适合时,数据存储在行或溢出页面上。当您使用nvarchar(max)并存储超过4000个字符(8000字节)时,SQL Server使用不同的方法来存储数据 - 类似于旧的TEXT数据类型 - 它存储在LOB页面中。
性能方面 - 再次,对于N <4000和(最大) - 没有区别。好吧,从技术上讲,它会影响行大小估算并可能会引入一些问题 - 您可以在此处阅读更多相关信息:Optimal way for vaiable width colums
可能影响系统性能的是行大小。如果您有查询SCAN表,大行大小将导致每个表更多的数据页 - &gt;更多io操作 - &gt;性能下降。如果是这种情况,您可以尝试执行垂直分区并将nvarchar字段移动到不同的表。