Добавление справочных полей используя OData

Добрый день!
Возникла проблема с добавлением через OData объектов, а конкретно при создании объекта присвоения им значений в поля которые ссылаются на другие объекты. Текстовые поля заполняются без проблем, а поля с внешними ключами выдают ошибку. На прошлом вебинаре "Разработка BPMOnline 7.5" задавал аналогичный вопрос, обещали выслать пример, но уже три недели прошло, участникам вебинара ничего не выслали. Кто сталкивался с подобной задачей скиньте пример добавления какого нибудь объекта с полем которое ссылается на другой объект, заранее спасибо

Нравится

8 комментариев

Олег, а как Вы делаете и какая ошибка возникает?
Сейчас, к сожалению, нет времени подготовить примерчик, но, может быть, подскажу, что у Вас не так.

Я передаю xml запрос, но в нем не хватает описания для внешних ключей, поэтому и прошу пример

При обработке этого запроса произошла ошибка.При обработке этого запроса произошла ошибка.System.Data.Services.DataServiceException at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.Deserializer.HandlePostRequest()
at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
at System.Data.Services.DataService`1.HandleRequest()В элементе {http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}:properties обнаружено свойство "LeadType" типа "Terrasoft.Configuration.Lead", объявленное как свойство навигации. Свойства навигации в ATOM должны быть представлены элементами {http://www.w3.org/2005/Atom}:link.Microsoft.Data.OData.ODataException at Microsoft.Data.OData.Atom.ODataAtomPropertyAndValueDeserializer.ReadPropertiesImplementation(IEdmStructuredType structuredType, List`1 properties, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, Boolean epmPresent)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomContentElement(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomElementInEntry(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadEntryContent(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomReader.ReadAtEntryStartImplementation()
at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()
at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)
at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)
at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)

Т.е. внешние ключи (поля содержащие guid других объектов) должны описываться через тег link, как его описать для нового объекта?
Для уже созданных он описывается с guid, но при создании guid'a еще нет

<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/LeadType" type="application/atom+xml;type=entry" title="LeadType" href="LeadCollection(guid'40d83682-7ee5-4f1f-a387-12bb43373b5b')/LeadType" />

Олег, подобный вариант подойдет?

//...
            var content = new XElement(dsmd + "properties",
                          new XElement(ds + "Name", "Тестов Тест Тестович"),
                          new XElement(ds + "Dear", "Тест Тестович"),
                          new XElement(ds + "TypeId", Guid.Parse("806732ee-f36b-1410-a883-16d83cab0980")), // Тип
                          );
            var entry = new XElement(atom + "entry",
                        new XElement(atom + "content",
                        new XAttribute("type", "application/xml"), content));
//...

Дмитрий, к сожалению нет, используя Ваш вариант генерируется xml следующего вида

<entry xmlns="http://www.w3.org/2005/Atom">
  <content type="application/xml">
    <properties xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
      <Name xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">Тестов Тест Тестович</Name>
      <Dear xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">Тест Тестович</Dear>
      <TypeId xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">806732ee-f36b-1410-a883-16d83cab0980</TypeId>
    </properties>
  </content>
</entry>

тем не менее обязательный тег link все так же отсутствует и ошибка остается прежней

Также есть вопрос как добавлять файлы через OData? Например необходимо загружать фотографии для контактов - как добавить файл в таблицу SysImage?

Олег, этот вопрос уже поднимался:
http://www.community.terrasoft.ru/forum/topic/10486

Спасибо, вопрос по добавлению объектов со справочными полями все еще актуален

Олег, для того, чтобы сервер стал возвращать ответ в виде JSON, необходимо добавить http заголовок (Accept: application/json;odata=verbose).
Список рекомендуемых http заголовков:
MaxDataServiceVersion: 3.0
Content-Type: application/json;odata=verbose
DataServiceVersion: 1.0
Accept: application/json;odata=verbose

Далее, пример POST запроса с указанием справочной колонки. Создается запись, которая ссылается на контакта с (Id = 62f1494a-1205-45a4-b211-7ab974df6e7e). Обращаем внимание, что это будет работать только в том случае, если запись справочника уже создана. OData позволяет добавлять запись с указанием справочного значения, которого еще нет. Но такой запрос намного сложнее и ситуации, когда он необходим, довольно ограничены:

{"Id":"de303d33-e3c2-4dbd-905a-f46d220140c8","Name":"Test","Contact":{"__metadata":{"uri":"ContactCollection(guid'62f1494a-1205-45a4-b211-7ab974df6e7e')"}}}

Показать все комментарии