2011-11-21 11 views
0

DTOオブジェクトを持つWCF Ria Services Appがあります。私は私のDTOオブジェクト間の関係を定義した:オブジェクトをドメインメソッドに渡す際の問題

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

だから私は、クライアント上のアイテムのコレクションを参照し、それを動作させることができます。次に、変更を保存してこのメ​​ソッドを呼び出します。

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

ドメインサービスメソッドです。しかし、Orderオブジェクト内の関連するItemsのコレクションは、すでにNULLであると考えられますが、このメソッドをクライアントで呼び出すと、このメソッドコレクションへの順序が満たされます。

誰も知らないのですか?ありがとう。

答えて

1

これは、クライアント側のシリアライザにアソションが含まれていないためです。 Wcf riaサービスは、このような状況に対処する方法が異なりますが、これにはDomainContextと標準のGet/Insert/Update/Deleteメソッドの使用が含まれます。 私のアドバイスは

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

Thi`sような何かにあなたの保存方法の符号を変更することですが、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; 
    } 
} 

はもちろん、あなたが反対、クライアント側を行い、ご注文やアイテムをシリアル化する必要があります。 これは私が知っているところに行くのが一番簡単な方法ですが、見ることもできますhere。 結局、WCFリアは(コンテキストベース)に行くことを意図している方法でコードをリファクタリングしてみてください、このことができます

希望、
マルコ

関連する問題