当前位置: 首页 > web开发 > Silverlight > 正文

使用LINQ和ADO.NET创建Silverlight程序(7)

时间:2011-10-23 51CTO 黄永兵 译

同样,在创建对象或删除对象时也需要通知DataServiceContext,如:

void addNewButton_Click(object sender, RoutedEventArgs e)
{
Product theProduct = new Product();
// ...
TheContext.AddObject(theProduct);
}
void deleteButton_Click(object sender, RoutedEventArgs e)
{
Product theProduct = (Product)theList.SelectItem;
TheContext.DeleteObject(theProduct);
theCollection.Remove(theProduct);
}

在这些代码中,你可以在你的Silverlight UI中修改这些对象,让数据绑定和变化通知 代码确保让DataServiceContext知道所有变化都会引发什么后果,但你如何对这些服务执行真实的更新呢 ?

通过服务更新

现在你的DataServiceContext对象已经知道数据的变化,但还需要一个方法通知给服务器,为了解决 这个问题,DataServiceContext类提供了一个BeginSaveChanges方法,它和本文前面描述的查询都使用了 相同的异步方法,BeginSaveChanges方法将所有变化都吸收进DataServiceContext,并将它们发送给服务 器:

TheContext.BeginSaveChanges(SaveChangesOptions.None,
new AsyncCallback(OnSaveAllComplete), null);

调用BeginSaveChanges时,有一个标 志枚举调用SaveChangesOptions,这个枚举允许你指定两个选项:是否使用批处理,是否继续,即使某些 变化保存失败。通常,我建议使用批处理,实际上,在某些父/子关系类型上批处理是必须的,因为父子 之间可能使用了引用完整性约束,这样更新才能保证父子之间的一致性。

保存完毕时,将会执行callback,有两个机制可以传播错误消息给你,首先,如果在执行保存时出 现了异常,当你在调用EndSaveChanges时,会抛出异常,因为如此,你可能想要使用try/catch来捕获灾 难性的错误;另外,EndSaveChanges返回的类型是一个DataServiceResponse对象,DataServiceResponse 有一个HasErrors属性,但在Silverlight 2 Beta 2版本库中它还不够安全:

void OnSaveAllComplete(IAsyncResult result)
{
bool succeeded = true;
try
{
DataServiceResponse response =
(DataServiceResponse)TheContext.EndSaveChanges(result);
foreach (OperationResponse opResponse in response)
{
if (opResponse.HasErrors)
{
succeeded = false;
}
}
}
catch (Exception ex)
{
succeeded = false;
}
// Alert the User
}