0

DTO オブジェクトを含む WCF Ria サービス アプリがあります。DTO オブジェクト間の関係を次のように定義しました。

[Include] 
    [Association("FK_Items_OrderID", "ID", "OrderID")] 
    public List<Item> Items { get; set; }

そのため、クライアントでアイテムのコレクションを表示して操作できます。次に、変更を保存してこのメ​​ソッドを呼び出します。

 [Invoke]
    public void SaveOrderChanges(Order order)
    {
        _dataManager.SaveOrderChanges(order);
    }

ドメインサービス方式です。しかし、ここの Order オブジェクトの関連するアイテムのコレクションは既に NULL であることがわかりますが、クライアントでこのメソッドを呼び出して、このメソッド コレクションに注文を渡すと、いっぱいになります。

何をすべきか知っている人はいますか?ありがとう。

4

1 に答える 1

1

これは、クライアント側のシリアライザーに関連付けが含まれていないために発生します。Wcf ria サービスには、この種のシナリオを処理する別の方法がありますが、これには DomainContext と標準の Get/Insert/Update/Delete メソッドの使用が含まれます。私のアドバイスは、save メソッドの符号を次のように変更することです。

[Invoke]
public void SaveOrderChanges(string serializedOrder)
{
    Order order = MyCustomSerializer.Deserialize<Order>(serializedOrder);
    _dataManager.SaveOrderChanges(order);
}

これは、オブジェクトをシリアル化および逆シリアル化するために使用するユーティリティ クラスですが、Items コレクションを含めるようにだます必要があります。

public static class Serialization
{
    public static string Serialize<T>(T obj)
    {
        //Create a stream to serialize the object to.
        var ms = new MemoryStream();

        // Serializer the User object to the stream.
        var ser = new DataContractSerializer(typeof (T));


        ser.WriteObject(ms, obj);
        byte[] array = ms.ToArray();
        ms.Close();
        return Encoding.UTF8.GetString(array, 0, array.Length);
    }

    public static T Deserialize<T>(string obj) where T : class
    {
        if (obj == null)
            return null;
        var serializer = new DataContractSerializer(typeof (T));
        var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj));
        var result = serializer.ReadObject(stream) as T;
        return result;
    }
}

もちろん、逆のクライアント側を実行して、注文とアイテムをシリアル化する必要があります。これは私が知っている最も簡単な方法ですが、こちらもご覧ください。最終的には、WCF Ria が意図する方法でコードをリファクタリングしてみてください (コンテキスト ベース)。

これが役に立てば幸いです、
マルコ

于 2011-11-21T09:11:10.173 に答える