2011-11-21 3 views
0

У меня есть приложение WCF Ria Services с объектами DTO. Я определил отношения между объектами 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, но когда я вызываю этот метод на клиенте и передаю его, этот набор методов заполняется.

Кто-нибудь знает, что делать? Благодарю.

ответ

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 Ria предназначаются, чтобы идти (Context основе)

Надеется, что это помогает,
Marco