【问题标题】:Is there a way to override the nvarchar(max) with a set maxlength value using EF 4.2 codefirst configuration?有没有办法使用 EF 4.2 codefirst 配置用设置的 maxlength 值覆盖 nvarchar(max)?
【发布时间】:2011-11-16 01:00:59
【问题描述】:

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

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

有没有一种方法可以全局应用执行此操作的配置?似乎模型构建器上的配置 api 只允许每个实体覆盖,而模型构建器上的约定 api 只允许删除。看到这个question

【问题讨论】:

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


    【解决方案1】:

    不,没有可用的全局配置。在 CTP 阶段从 EF Code First 中删除了自定义约定。

    【讨论】:

    • hmmm ...我会看看反射器,看看是否有任何方法可以使用最大长度的副本来实现破解。
    【解决方案2】:

    我认为你可以做到。在模型表中的属性上方添加 StringLength 属性。就像跟随一样。 (请记住,您需要使用 System.ComponentModel.DataAnnotations;)

        [StringLength(160)]
        public string Title { get; set; }
    

    更新

    • 首先,您不能在 nvarchar(MAX) 列上创建索引。您可以使用全文索引,但不能在列上创建索引来提高查询性能。

    • 从存储角度来看,当 N

    • 性能方面 - 同样,对于 NOptimal way for vaiable width colums

    • 会影响系统性能的是行大小。如果您有 SCAN 表的查询,较大的行大小将导致每个表的数据页更多 -> 更多 io 操作 -> 性能下降。如果是这种情况,您可以尝试进行垂直分区并将 nvarchar 字段移动到不同的表中。

    【讨论】:

    • 嗨,我正在寻找一个全球公约。
    • 全球惯例是仅使用 nvarchar(MAX)。你所能做的就是单独覆盖它,这就是它应该的样子。如果您希望项目中的所有字符串属性都具有固定长度,那么为什么不在模型类中添加一个检测字符串属性的函数或类并为您附加 StringLenth 属性
    • 这是默认的全局约定,我希望覆盖它并为我的项目设置自己的约定。 nvarchar(MAX) 的缺点是我不想影响我的项目,如果我将来需要在数据库级别对其进行优化,即没有索引 nvarchar(MAX) 列。
    • 我已根据您对 nvarchar(MAX) 的担忧更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多