首页 > 解决方案 > 如何在 ODataConventionModelBuilder 中实现自定义约定

问题描述

当针对 OData v4 服务时,我想在客户端执行字符串长度验证以防止数据往返 API,但是如果信息可以通过 $metadata.xml 传递,我不想手动编码每个输入字段。

事实证明,ODataConventionModelBuilder确实可以正确解释MaxLengthAttribute数据类并设置适当的EdmProperty值,但它没有相应的解释约定StringLengthAttribute。以下片段$metadata显示了给定假设类定义的预期输出:

<EntityType Name="NoteType">
    <Key>
        <PropertyRef Name="Id"/>
    </Key>
    <Property Name="Title" MaxLength="100" Type="Edm.String"/>
    <Property Name="Description" MaxLength="500" Type="Edm.String"/>
    <Property Name="Id" Type="Edm.Int32" Nullable="false"/>
</EntityType>
public class NoteType
{
    [Key]
    public int Id { get; set; }
    [StringLength(100)]
    public string Title { get; set; }
    [MaxLength(500)]
    public string Description { get; set; }
}

请注意,Description带有注释MaxLengthAttributeTitle正在使用StringLengthAttribute

$metadata 中的实际输出不包括MaxLength属性Title

<EntityType Name="NoteType">
    <Key>
        <PropertyRef Name="Id"/>
    </Key>
    <Property Name="Title" Type="Edm.String"/>
    <Property Name="Description" MaxLength="500" Type="Edm.String"/>
    <Property Name="Id" Type="Edm.Int32" Nullable="false"/>
</EntityType>

我无法更改数据类定义,因为它们是从 3rd 方程序集派生的,因此我正在寻找一种通用解决方案,如果数据属性具有定义.MaxLengthStringLengthAttributeMaxLength

在 EF6 和 EFCore 中,我习惯于实现自定义约定以在 DbContext 中实现业务规则,因为名称中包含约定ODataConventionModelBuilder一词,我希望能够定义自己的约定并将它们插入管道。但我找不到如何做到这一点的好例子。

标签: c#odatadata-annotations

解决方案


推荐阅读