有没有办法使用EF 4.2 codefirst配置覆盖设置maxlength值的nvarchar(max)?

时间:2011-11-16 01:00:59

标签: configuration entity-framework-4.1 ef-code-first conventions maxlength

默认情况下,EF 4.2 codefirst将字符串属性后面的数据库列设置为nvarchar(max)。

单独(每个属性)我可以通过指定[MaxLength(512)]属性来覆盖此约定。

有没有办法全局应用这样做的配置?似乎模型构建器上的配置api仅允许每个实体覆盖,并且模型构建器上的约定api仅允许删除。请参阅此question

2 个答案:

答案 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字段移动到不同的表。