Проблема с передачей объектов в доменный метод - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть приложение 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 Ответ

1 голос
/ 21 ноября 2011

Это происходит потому, что сериализатор на стороне клиента не содержит ассоциаций.Сервисы Wcf ria имеют другой способ обработки этого вида сценариев, но это включает использование DomainContext и стандартных методов Get / Insert / Update / Delete.Мой совет - изменить знак вашего метода сохранения на что-то вроде

[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 (контекстно-зависимый)

Надеюсь, это поможет,Marco

...