我有带有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了,但是当我在客户端上调用这个方法并将命令传递给这个方法时,集合就被填充了。
有人知道该怎么办吗?感谢。
答案 0 :(得分:1)
这是因为客户端序列化程序不包含关联。 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;
}
}
当然,您需要执行相反的客户端并序列化您的订单和商品。 这是我所知道的最简单的方法,但你也可以看看here。 最后,尝试以WCF Ria的方式重构代码(基于上下文)
希望这有帮助,
马可