#c# #json #asp.net-core #odata
#c# #json #asp.сетевое ядро #одата
Вопрос:
Мне нужно изменить настройки записи odata, чтобы, когда записанный объект не соответствует схеме, он продолжал запись вместо того, чтобы выдавать ошибку при проверке свойств null, которые помечены как необходимые.
Код выглядит следующим образом:
var writerSettings = new ODataMessageWriterSettings(); writerSettings.Validations = ValidationKinds.None;
Мне нужен Microsoft.Средство записи сообщений AspNetCore OData для использования этих параметров. Но когда создается экземпляр ODataMessageWriter, у него нет этих настроек. Когда я отлаживаю и ставлю точку останова в конструкторе ODataMessageWriter, я могу изменять настройки и получать необходимые результаты.
writerSettings.Validations = ValidationKinds.ThrowOnDuplicatePropertyNames | ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType; // This is the desired setting.
Я заметил, что у нас определен и введен следующий класс,
public class MyODataRoutingApplicationModelProvider : IApplicationModelProvider { public MyODataRoutingApplicationModelProvider( IOptionslt;ODataOptionsgt; options) { options.Value.AddRouteComponents("odata/{datasource}/{COMPANY_CODE}", EdmCoreModel.Instance); }
Нужно ли мне изменять поставщика этой модели, чтобы он использовал эти настройки?
Следующее исключение-это начальная проблема, которую я пытался решить. Изменение уровня данных / модели/ схемы edm не представляется возможным вариантом, который мы хотели бы использовать для нашего решения / схемы базы данных.
Майкрософт.Одата.Исключение ODataException: Свойство ‘ImpArrivalDate[Nullable=False]’ типа ‘Edm.DateTimeOffset’ имеет нулевое значение, что недопустимо. в Microsoft.Одата.WriterValidationUtils.Проверьте значение nullproperty(IEdmTypeReference Ожидаемое значение Iedmtypereference, имя свойства строки, модель IEdmModel) в Microsoft.Одата.WriterValidator.Значение ValidateNullPropertyValue(ожидаемое значение параметра Iedmty, имя свойства строки, логический уровень, модель модели IEDMM) в корпорации Майкрософт.OData.JsonLight.Одатайсон осветил сериализатор.WriteNullProperty(свойство ODataPropertyInfo) в Microsoft.OData.JsonLight.Одатайсон осветил сериализатор.Свойство записи(свойство ODataProperty, тип собственности IEdmStructuredType, логический уровень истоков, средство проверки дубликата идентификатора, средство проверки дубликата идентификатора, средство создания метаданных ODataResourceMetadataBuilder) в Microsoft.OData.JsonLight.ODataJsonLightPropertySerializer.Свойства записи(тип собственности IEdmStructuredType, свойства IEnumerable`1, логическое значение ISCOMPLEX, средство проверки дубликата идентификатора, средство проверки дубликата идентификатора, средство проверки метаданных ODataResourceMetadataBuilder) в Microsoft.OData.JsonLight.Одатайсонлайтрайтер.StartResource(ресурс ODataResource) в корпорации Майкрософт.Одата.ODataWriterCore.lt;gt;c__DisplayClass123_0.b__0()
Свойство помечено как необходимое, но как обнуляемое, как показано в расширенном классе (ConsignmentAllHeaderXpo):
[XmlIgnore] [Delayed] [PersistentAlias("ShipmentDate")] [Template(typeof(HardDate1))] [Display(Name = "Arr.Date", Description = "Import Arrival Date")] [Description("Import Arrival Date")] [Required(ErrorMessage = "Field Arr.Date is required")] [RpsHelp(Text = "Expected Arrival Date")] public DateTime? ImpArrivalDate { get { return GetValuelt;DateTime?gt;(null, nameof(ImpArrivalDate)); } set { ShipmentDate = value; OnPropertyChanged(nameof(ImpArrivalDate)); } }
Ответ №1:
Я обнаружил, что изменение настроек записи, которые мне нужно использовать при обработке запроса, как показано здесь в действии контроллера, сработало:
[EnableQuery(PageSize = 1000)] public IActionResult Get([FromRoute] string COMPANY_CODE) { // Get entity set's EDM type: A collection type. ODataPath path = Request.ODataFeature().Path; IEdmCollectionType collectionType = (IEdmCollectionType)path.Last().EdmType; IEdmEntityTypeReference entityType = collectionType.ElementType.AsEntity(); // Setting validation settings on the request to not throw when writing a json response representation is solving the problem. // It stops validation errors occuring if the data does not conform to the schema. Request.GetWriterSettings().Validations = Microsoft.OData.ValidationKinds.ThrowOnDuplicatePropertyNames | Microsoft.OData.ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType; string myType = entityType.ShortQualifiedName(); Type xpoType = DataAccess.GetNameSpaceType(myType); var res = GetIQueryable(xpoType, COMPANY_CODE, false); return Ok(res); }