2016-12-13 6 views
0

Я пытаюсь использовать DotNetSDataClient library, чтобы добавить новый контакт в Infor CRM. Я попытался последовать за this documentation под заголовком Создать раздел. Когда я запускаю код примера, я получаю сообщение об ошибке «Учетная запись контакта требуется». Это имеет смысл, потому что я считаю, что каждый контакт в базе данных должен быть связан с учетной записью. Я изменил код, чтобы указать существующую учетную запись, но теперь я получаю сообщение об ошибке «К сожалению, вы столкнулись с ошибкой. Если это применимо, повторите попытку». с innerexception: «Сервер удаления ответил на ошибку: (500) Внутренняя ошибка сервера».Как создать новый контакт в Saleslogix Infor CRM с помощью DotNetSDataClient

Вот мой код.

public void someFunction(){ 
    var client = new SDataClient("https://domain/sdata/slx/dynamic/-/") 
    { 
     UserName = "username", 
     Password = "password" 
    }; 

    var contact = new Contact 
    { 
     Account = new Account 
     { 
      AccountName = "accountName", 
      Id = "accountId" 
     }, 
     Address = new Address 
     { 
      Address1 = "1234 Address", 
      City = "someCity", 
      PostalCode = "12345", 
      State = "ST" 
     }, 
     FirstName = "John", 
     LastName = "Doe" 
    }; 

    var contactOptions = new SDataPayloadOptions { Include = "Address" }; 

    try 
    { 
     contact = client.Post(contact, null, contactOptions); 
    } 
    catch (Exception ex) 
    { 
     var error = ex.Message; 
    } 
} 

[SDataPath("accounts")] 
public class Account 
{ 
    [SDataProtocolProperty(SDataProtocolProperty.Key)] 
    public string Id { get; set; } 

    public string AccountName { get; set; } 
    public List<Contact> Contacts { get; set; } 
    public string Status { get; set; } 
    public string Type { get; set; } 
} 

[SDataPath("contacts")] 
public class Contact 
{ 
    [SDataProtocolProperty(SDataProtocolProperty.Key)] 
    public string Id { get; set; } 

    public Account Account { get; set; } 
    public Address Address { get; set; } 
    public string Email { get; set; } 
    public string FirstName { get; set; } 
    public string FullName { get; set; } 
    public string LastName { get; set; } 
    public DateTime? ModifyDate { get; set; } 
    public string Status { get; set; } 
} 

[SDataPath("addresses")] 
public class Address 
{ 
    [SDataProtocolProperty] 
    public string Key { get; set; } 
    public string Address1 { get; set; } 
    public string Address3 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string CountryCode { get; set; } 
    public string Description { get; set; } 
    public string PostalCode { get; set; } 
    public string State { get; set; } 
    public string Street { get; set; } 
} 

У кого-нибудь есть идеи о том, что я делаю неправильно?

ответ

0

Я также разместил этот вопрос на GitHub и Райан Фарли, предоставив ответ. Я хотел включить его здесь, если кому-то еще понадобится это решение.

Проблема в том, как библиотека сериализует данные. Вот ответ Ryan:

«Настоящая проблема заключается в том, что у POCO для учетной записи есть коллекция контактов. DotNetSDataClient сериализует это как null, а серверу SData это не нравится. Даже установка этой коллекции в новый список() потерпит неудачу, потому что это будет получить сериализации, как []. где она должна выглядеть

"Contacts": { "$resources": [] } 

при выполнении POST с существующим родителем или связанным с организацией, SData рассчитывает только получить $ ключ и ничего в любом случае. Таким образом, когда класс Contact становится сериализованным, то, что вы должны отправлять с контактными данными, -

"Account": { "$key":"AXXX00000001" } 

и ничего более, но это не тот случай, библиотека сериализует и отправляет все ».

На данный момент решение заключается в создании класса учетной записи, который имеет только свойство id (key).

[SDataPath("accounts")] 
public class Account 
{ 
    [SDataProtocolProperty(SDataProtocolProperty.Key)] 
    public string Id { get; set; } 
} 

В какой-то момент библиотека DotNetSDataClient может обновляться справиться с этой ситуацией, но сейчас это решение.