При нацеливании на службу 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
имеет Слово соглашение в нем, я ожидал, что смогу определить свои собственные соглашения и подключить их к конвейеру. но я не могу найти хороший пример того, как это сделать.