Установка значений свойств элемента
Пример показывает, как обновить собственные свойства элемента (наименование и количество) средствами
клиентской библиотеки Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.UpdateElementProperty.
Требования
- .NET 8.
- Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
- Пакет
Ascon.Polynom.Web.Api.Clientиз локального фида (подключается автоматически).
Алгоритм
- Авторизоваться в web-API.
- Задать Uid элемента.
- Получить свойства элемента.
- Сформировать запрос на обновление значений.
- Отправить запрос и выйти из сессии.
Авторизация
Авторизация выполняется хелпером PolynomClientSession поверх
AuthorizationService.
Подробно — в разделе
Авторизация в C# через клиентскую библиотеку.
Реализация
Свойства элемента возвращает метод GetByUid сервиса
PropertyOwnerApiClient.
Системное определение свойства «Количество» ищется методом GetByCode сервиса
PropertyDefinitionApiClient.
Обновление значений выполняет метод SetPropertyValues с моделью
SetPropertyValuesRequest.
using Ascon.Polynom.Web.Api.Client.Enums;
using Samples.WebApi.Common.Services;
using var session = await PolynomClientSession.CreateAsync(cancellationToken);
// Uid элемента (например, скопированный из сводки тестового хранилища).
var objectUid = "8a0eaacf-0306-4772-bfe5-96f129fee31b";
var properties = await session.Factory.CreatePropertyOwnerApiClient()
.GetByUid(new GetByUidRequest { Id = objectUid }, cancellationToken);
var contractElement = properties!.AllContracts.FirstOrDefault(x => x.Name == "Элемент классификации")
?? throw new InvalidOperationException("Контракт «Элемент классификации» не найден.");
var definitionElementName = properties.Definitions.StringProperties!.FirstOrDefault(x => x.Name == "Наименование")
?? throw new InvalidOperationException("Свойство «Наименование» не найдено.");
var quantityDefinition = await session.Factory.CreatePropertyDefinitionApiClient()
.GetByCode(new GetByCodeRequest { Code = "@Quantity" }, cancellationToken)
?? throw new InvalidOperationException("Определение свойства «@Quantity» не найдено.");
var updateValueRequest = new SetPropertyValuesRequest
{
Owner = new IdentifiableObject
{
ObjectId = properties.PropertyOwner.ObjectId,
TypeId = IdentifiableObjectType.Element
},
Values = new AblePropertyValuesRequest
{
StringProperties = new List<IStringPropertyValueRequest>
{
new StringPropertyValueRequest
{
Value = "NewNameFromExample",
ObjectId = 123,
TypeId = IdentifiableObjectType.StringPropertyValue
}
},
DoubleProperties = new List<IDoublePropertyValueRequest>
{
new DoublePropertyValueRequest
{
Value = new DoubleValue
{
MinValue = 1111,
MaxValue = 9999,
Mode = DoublePropertyMode.Range
},
ObjectId = 456,
TypeId = IdentifiableObjectType.DoublePropertyValue
}
}
},
Properties = new List<IPropertyValueItem>
{
new PropertyValueItem
{
Value = new IdentifiableObject { ObjectId = 123, TypeId = IdentifiableObjectType.StringPropertyValue },
Contract = new IdentifiableObject { ObjectId = contractElement.ObjectId, TypeId = contractElement.TypeId },
Definition = new IdentifiableObject { ObjectId = definitionElementName.ObjectId, TypeId = definitionElementName.TypeId },
EvaluationMode = EvaluationMode.None
},
new PropertyValueItem
{
Value = new IdentifiableObject { ObjectId = 456, TypeId = IdentifiableObjectType.DoublePropertyValue },
Contract = null,
Definition = new IdentifiableObject { ObjectId = quantityDefinition.ObjectId, TypeId = quantityDefinition.TypeId },
EvaluationMode = EvaluationMode.None
}
}
};
await session.Factory.CreatePropertyOwnerApiClient().SetPropertyValues(updateValueRequest, cancellationToken);
await session.SignOutAsync(cancellationToken);
Используемые методы библиотеки
| Сервис | Метод | Назначение |
|---|---|---|
PropertyOwnerApiClient |
GetByUid(GetByUidRequest, CancellationToken) |
Свойства элемента по Uid |
PropertyDefinitionApiClient |
GetByCode(GetByCodeRequest, CancellationToken) |
Определение свойства по коду |
PropertyOwnerApiClient |
SetPropertyValues(SetPropertyValuesRequest, CancellationToken) |
Обновление значений свойств |
Результат
Свойства элемента обновляются: изменяется значение строкового свойства «Наименование», а системное свойство «Количество» добавляется элементу как собственное.
Возможные ошибки
- Элемент не найден по Uid — проверьте Uid.
- Свойство не найдено — системные свойства определяются контрактом «Элемент классификации»
и определением по коду
@Quantity; в другом хранилище контракты могут отличаться. - Ошибка доступа — у пользователя нет прав на изменение свойств.
Ссылки
Пример-приложение в составе SDK: SDK/Web/Samples/Server/Samples.WebApi.UpdateElementProperty.