0

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

私が間違っていることについて何か考えがある人はいますか?

4

1 に答える 1

0

この質問も GitHub に投稿し、Ryan Farley が回答を提供してくれました。他の誰かがこのソリューションを必要とする場合に備えて、ここに含めたいと思いました。

問題は、ライブラリがデータをシリアル化する方法にあります。Ryan の応答は次のとおりです。

「ここでの本当の問題は、Account の POCO に連絡先のコレクションがあることです。DotNetSDataClient はそれを null としてシリアル化していますが、SData サーバーはそれを好みません。そのコレクションを new List() に設定しても、シリアル化されるため失敗します。 [] として。

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

既存の親エンティティまたは関連するエンティティで POST を実行する場合、SData は $key のみを受け取ることを想定しており、それ以外は何も受け取りません。したがって、Contact クラスがシリアライズされると、連絡先データと一緒に送信する必要があるのは次のとおりです。

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

それ以上はありませんが、そうではなく、ライブラリはすべてをシリアライズして送信しています。」

この時点での解決策は、id (キー) プロパティのみを持つアカウント クラスを作成することです。

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

ある時点で DotNetSDataClient ライブラリが更新され、この状況を処理できるようになる可能性がありますが、現時点ではこれが解決策です。

于 2016-12-14T13:42:53.840 に答える