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