Служба данных WCF BeginSaveИзменяет не сохранять изменения в приложении Silverlight - PullRequest
0 голосов
/ 30 мая 2010

У меня чертовски трудно заставить WCF Data Services работать в Silverlight. Я использую VS2010 RC.

Я боролся с междоменной проблемой, требующей использования clientaccesspolicy.xml & crossdomain.xml файлов в корневой папке веб-сервера, но я просто не мог заставить это работать. Чтобы решить эту проблему, я прибегнул к тому, чтобы поместить и веб-приложение Silverlight, и службу данных 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;
    }
}

Я ущипнул код OnStartProcessingRequest из статьи Скотта Хансельмана Создание OData API для StackOverflow, включая XML и JSON, за 30 минут .

Вот мой код из моего приложения 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 | Ложь».

Мое намерение состоит в том, чтобы заставить работать концептуальное доказательство, а затем провести соответствующее разделение задач, чтобы превратить это в простое бизнес-приложение.

Я потратил на это часы. Меня сводят с ума. Есть идеи, как заставить это работать?

Ответы [ 2 ]

3 голосов
/ 30 мая 2010

Оказывается, я идиот. Вы должны вызвать UpdateObject в контексте данных, чтобы явно объявить, что объект был обновлен. Теперь это отстой. Почему он не может отслеживать изменения?

1 голос
/ 12 июня 2010

Если вы хотите отслеживать изменения, вам нужно сгенерировать клиентские классы с поддержкой для них, и вам нужно использовать DataServiceCollection для хранения ваших результатов. Хорошее описание здесь: http://msdn.microsoft.com/en-us/library/ee373844.aspx

...