Добрый день!
Возникла проблема с добавлением через OData объектов, а конкретно при создании объекта присвоения им значений в поля которые ссылаются на другие объекты. Текстовые поля заполняются без проблем, а поля с внешними ключами выдают ошибку. На прошлом вебинаре "Разработка BPMOnline 7.5" задавал аналогичный вопрос, обещали выслать пример, но уже три недели прошло, участникам вебинара ничего не выслали. Кто сталкивался с подобной задачей скиньте пример добавления какого нибудь объекта с полем которое ссылается на другой объект, заранее спасибо
Нравится
Олег, а как Вы делаете и какая ошибка возникает?
Сейчас, к сожалению, нет времени подготовить примерчик, но, может быть, подскажу, что у Вас не так.
Я передаю 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')"}}}