WCF数据服务BeginSaveChanges不保存Silverlight应用程序中的更改

时间:2010-05-30 02:10:02

标签: silverlight entity-framework wcf-data-services

我有一段时间让WCF数据服务在Silverlight中运行。我正在使用VS2010 RC。

我一直在努力解决需要使用clientaccesspolicy.xml&的跨域问题。 Web服务器根文件夹中的crossdomain.xml个文件,但我无法让它工作。我已经使用了Silverlight Web App&同一个项目中的WCF数据服务可以解决这个问题,但是这里的任何建议都会很好。

但是现在我实际上可以看到我的数据来自数据库并在Silverlight中的数据网格中显示我认为我的麻烦已经结束了 - 但没有。我可以编辑数据并且内存中实体正在改变,但是当我调用BeginSaveChanges(使用适当的异步EndSaveChanges调用)时,我没有错误,但数据库中没有数据更新。

这是我的WCF数据服务代码:

public class MyDataService : DataService<MyEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }

    protected override void OnStartProcessingRequest(ProcessRequestArgs args)
    {
        base.OnStartProcessingRequest(args);
        HttpContext context = HttpContext.Current;
        HttpCachePolicy c = HttpContext.Current.Response.Cache;
        c.SetCacheability(HttpCacheability.ServerAndPrivate);
        c.SetExpires(HttpContext.Current.Timestamp.AddSeconds(60));
        c.VaryByHeaders["Accept"] = true;
        c.VaryByHeaders["Accept-Charset"] = true;
        c.VaryByHeaders["Accept-Encoding"] = true;
        c.VaryByParams["*"] = true;
    }
}

我已经从Scott Hanselman的文章Creating an OData API for StackOverflow including XML and JSON in 30 minutes中捏了OnStartProcessingRequest代码。

这是我的Silverlight应用程序中的代码:

private MyEntities _wcfDataServicesEntities;
private CollectionViewSource _customersViewSource;
private ObservableCollection<Customer> _customers;

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
    {
        _wcfDataServicesEntities = new MyEntities(new Uri("http://localhost:7156/MyDataService.svc/"));
        _customersViewSource = this.Resources["customersViewSource"] as CollectionViewSource;
        DataServiceQuery<Customer> query = _wcfDataServicesEntities.Customer;
        query.BeginExecute(result =>
        {
            _customers = new ObservableCollection<Customer>();
            Array.ForEach(query.EndExecute(result).ToArray(), _customers.Add);
            Dispatcher.BeginInvoke(() =>
            {
                _customersViewSource.Source = _customers;
            });
        }, null);
    }
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    _wcfDataServicesEntities.BeginSaveChanges(r =>
    {
        var response = _wcfDataServicesEntities.EndSaveChanges(r);
        string[] results = new[]
        {
            response.BatchStatusCode.ToString(),
            response.IsBatchResponse.ToString()
        };
        _customers[0].FinAssistCompanyName = String.Join("|", results);
    }, null);
}

我收到数据的响应字符串绑定到我的网格确定并显示“-1 | False”。

我的目的是让概念验证在这里工作,然后对问题进行适当的分离,将其变成一个简单的业务线应用程序。

我花了好几个小时来做​​这件事。我被驱使疯了。任何想法如何使这个工作?

2 个答案:

答案 0 :(得分:3)

原来我是个白痴。您必须在数据上下文上调用UpdateObject以显式声明对象已更新。现在这很糟糕。为什么不能跟踪变化?

答案 1 :(得分:1)

如果您想要更改跟踪,则需要生成支持它的客户端类,并且需要使用DataServiceCollection来存储结果。这里有一个很好的描述:http://msdn.microsoft.com/en-us/library/ee373844.aspx