Как создать новый контакт в Saleslogix Infor CRM с помощью DotNetSDataClient

Я пытаюсь использовать библиотеку DotNetSDataClient для добавления нового контакта в Infor CRM. Я пытался следовать этой документации в разделе " Создать ". Когда я запускаю пример кода, я получаю сообщение об ошибке "Требуется учетная запись контакта". Это имеет смысл, потому что я считаю, что каждый контакт в базе данных должен быть связан с учетной записью. Я изменил код, чтобы указать существующую учетную запись, но теперь я получаю сообщение об ошибке "Приносим извинения, вы столкнулись с ошибкой. Если применимо, повторите попытку". с отсутствием исключения: "Сервер удаления возвратил ошибку: (500) Внутренняя ошибка сервера".

Вот мой код

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; }
}

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

1 ответ

Решение

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

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

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

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

При выполнении POST с существующим родительским или связанным объектом SData ожидает только получение ключа $ и ничего больше. Итак, когда класс Contact будет сериализован, то, что вы должны отправить с контактными данными,

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

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

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

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

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

Другие вопросы по тегам