Как реализовать пользовательские соглашения в ODataConventionModelBuilder - PullRequest
0 голосов
/ 17 марта 2020

При нацеливании на службу OData v4 я хочу выполнить проверку длины строки на стороне клиента, чтобы не допустить циклический переход данных в API, однако я не хочу вручную кодировать каждое поле ввода, если информация может быть передана через $ metadata.

Оказывается, что 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 помечен MaxLengthAttribute, но Title использование StringLengthAttribute

Фактический вывод в метаданных $ не включает 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>

Я не могу вносить изменения в данные определения классов, как они получены из сторонних сборок, поэтому я ищу универсальное c решение для правильной настройки всех свойств в EdmModel с соответствующим атрибутом MaxLength, если свойство данных имеет StringLengthAttribute который определяет MaxLength.

В EF6 и EFCore я привык к реализации пользовательских соглашений для реализации бизнес-правил в DbContext, учитывая, что имя ODataConventionModelBuilder имеет Слово соглашение в нем, я ожидал, что смогу определить свои собственные соглашения и подключить их к конвейеру. но я не могу найти хороший пример того, как это сделать.

...