2012-08-12 85 views
0

如果这是一个新手问题,我很抱歉,但我是C#编程的新手。如何实现IUpdatable服务

但我正在尝试编写一个WCF数据服务,它读取数据并吐出odata feed就好了。我在VS中添加了服务引用,它为我创建了服务类型和数据模型,但我似乎缺少一个SaveChanges()方法(我在一堆教程中看到了这个方法)。

这导致我转向IUpdatable,目前停止了兔子的洞。当有人说“你的服务不支持更新,因为它没有实现IUpdatable”,这意味着什么。我如何实现这个接口?它甚至意味着什么实现这个接口?

此外,这是Windows Phone应用程序。

+0

如果我对你的问题的理解是正确的,这对我来说有点令人惊讶。在“添加服务引用”(ASR)时间,我认为客户端不会进行任何特殊检查来查看服务是否为读/写(它实际上需要POST服务来测试)。因此理论上它应该始终生成SaveChanges()方法,而不管实现IUpdatable的服务如何。你能在这里给我们更多的细节吗?您正在使用哪些版本的Visual Studio,Windows Phone SDK和WCF数据服务?您是如何生成服务参考的? – 2012-08-12 15:45:02

+0

我正在使用VS2010 Ultimate,Windows Phone SDK 7.1,不确定我使用的是哪个版本的WCF数据服务。我将如何发现?我添加WCf服务的方式是右键单击Referecnces,clicekd添加服务引用,输入到我的WCF数据服务.scv url中,键入命名空间并单击确定。然后它为我创建了datasvcmap和.cs文件。 – 2012-08-12 19:02:15

+1

对不起,刚刚注册的Windows Phone 7位 - 这些方法在WP7上是异步的,所以它们遵循“BeginSaveChanges”和“EndSaveChanges”的通用命名约定。请参阅下面的示例。 – 2012-08-12 23:44:39

回答

1

由于Windows Phone 7是基于Silverlight的,因此需要异步,因此在上下文中没有SaveChanges方法,而是使用BeginSaveChangesEndSaveChanges方法对。你可以打电话给他们,像这样:

private void SaveChanges_Click(object sender, RoutedEventArgs e) 
{ 
    // Start the saving changes operation. 
    svcContext.BeginSaveChanges(SaveChangesOptions.Batch, 
     OnChangesSaved, svcContext); 
} 

private void OnChangesSaved(IAsyncResult result) 
{ 
    // Use the Dispatcher to ensure that the 
    // asynchronous call returns in the correct thread. 
    Dispatcher.BeginInvoke(() => 
     { 
      svcContext = result.AsyncState as NorthwindEntities; 

      try 
      { 
       // Complete the save changes operation and display the response. 
       WriteOperationResponse(svcContext.EndSaveChanges(result)); 
      } 
      catch (DataServiceRequestException ex) 
      { 
       // Display the error from the response. 
       WriteOperationResponse(ex.Response); 
      } 
      catch (InvalidOperationException ex) 
      { 
       messageTextBlock.Text = ex.Message; 
      } 
      finally 
      { 
       // Set the order in the grid. 
       ordersGrid.SelectedItem = currentOrder; 
      } 
     } 
    ); 
} 

这样品是来自http://msdn.microsoft.com/en-us/library/gg521146(VS.92).aspx

0

如果问题不在于客户端上的缺少SaveChanges方法(Mark的答案上面应该解决),并且您已经创建了应该支持读写访问的服务,那么您可能需要实现IUpdatable接口(在服务器上)。

如果您的服务使用EF提供程序,那么这应该已经可以工作,因为EF提供程序实现了IUpdatable开箱即用。

如果您的服务使用反射提供程序,那么您将需要在您的上下文中实现IUpdatable。这里有一些描述:http://msdn.microsoft.com/en-us/library/dd723653.aspx

如果您使用的是自定义的供应商,那么你也将需要实现IUpdatable并有那样品为好,但我不认为你走这条路:-)