SL3 / SL4 - Ошибка служб данных Ado.Net во время новой DataServiceCollection <T>(queryResponse) - PullRequest
1 голос
/ 11 мая 2010

Привет всем, у меня есть две функции в проекте SL (VS2010), которые делают почти одно и то же, но одна выдает ошибку, а другая - нет. Похоже, это связано с прогнозами, но я не уверен в том, как лучше решить эту проблему.

Работающая функция ...

public void LoadAllChunksExpandAll(DataHelperReturnHandler handler, string orderby)
    {
        DataServiceCollection<CmsChunk> data = null;

        DataServiceQuery<CmsChunk> theQuery = _dataservice
            .CmsChunks
            .Expand("CmsItemState")
            .AddQueryOption("$orderby", orderby);

        theQuery.BeginExecute(
            delegate(IAsyncResult asyncResult)
            {
                _callback_dispatcher.BeginInvoke(
                        () =>
                        {
                            try
                            {
                                DataServiceQuery<CmsChunk> query = asyncResult.AsyncState as DataServiceQuery<CmsChunk>;
                                if (query != null)
                                {
                                    //create a tracked DataServiceCollection from the result of the asynchronous query.
                                    QueryOperationResponse<CmsChunk> queryResponse =
                                        query.EndExecute(asyncResult) as QueryOperationResponse<CmsChunk>;
                                    data = new DataServiceCollection<CmsChunk>(queryResponse);

                                    handler(data);
                                }
                            }
                            catch
                            {
                                handler(data);
                            }
                        }
                    );
            },
            theQuery
        );
    }

Это компилируется и работает как ожидалось. Очень, очень похожая функция (показанная ниже) не работает ...

             public void LoadAllPagesExpandAll(DataHelperReturnHandler handler, string orderby)
    {
        DataServiceCollection<CmsPage> data = null;

        DataServiceQuery<CmsPage> theQuery = _dataservice
            .CmsPages
            .Expand("CmsChildPages")
            .Expand("CmsParentPage")
            .Expand("CmsItemState")
            .AddQueryOption("$orderby", orderby);

        theQuery.BeginExecute(
            delegate(IAsyncResult asyncResult)
            {
                _callback_dispatcher.BeginInvoke(
                        () =>
                        {
                            try
                            {
                                DataServiceQuery<CmsPage> query = asyncResult.AsyncState as DataServiceQuery<CmsPage>;
                                if (query != null)
                                {
                                    //create a tracked DataServiceCollection from the result of the asynchronous query.
                                    QueryOperationResponse<CmsPage> queryResponse = query.EndExecute(asyncResult) as QueryOperationResponse<CmsPage>;
                                    data = new DataServiceCollection<CmsPage>(queryResponse);

                                    handler(data);
                                }
                            }
                            catch
                            {
                                handler(data);
                            }
                        }
                    );
            },
            theQuery
        );
    }

Очевидно, что проблема заключается в проекциях Expand, которые включают в себя отношения со ссылками на себя (страницы могут содержать другие страницы). Это под SL4 или SL3 с использованием ADONETDataServices SL3 Обновление CTP3.

Я открыт для любой работы или указателей на получение информации, поиск в Google по ошибке приводит к двум попаданиям, и ни одно из них не помогает в расшифровке.

Краткая ошибка: «Элемент не может быть добавлен в коллекцию. Когда элементы в DataServiceCollection отслеживаются DataServiceContext, новые элементы не могут быть добавлены до того, как элементы были загружены в коллекцию».

Полная ошибка ...

System.Reflection.TargetInvocationException было поймано сообщение = исключение имеет был брошен целью призывание. Трассировки стека: в System.RuntimeMethodHandle._InvokeMethodFast (IRuntimeMethodInfo метод, объект цель, объект [] аргументы, SignatureStruct & sig, MethodAttributes methodAttributes, RuntimeType typeOwner) в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder связыватель, параметры Object [], КультураИнфо, Булевская культура skipVisibilityChecks) в System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, Binder связыватель, параметры Object [], КультураИнфо культуры) в System.Reflection.MethodBase.Invoke (Object obj, параметры Object []) в System.Data.Services.Client.ClientType.ClientProperty.SetValue (Object экземпляр, значение объекта, строка propertyName, логическое allowAdd) в System.Data.Services.Client.AtomMaterializer.ApplyItemsToCollection (AtomEntry запись, свойство ClientProperty, IE Многочисленные предметы, Uri nextLink, ПроекцияПлан продолжениеПлан) в System.Data.Services.Client.AtomMaterializer.ApplyFeedToCollection (AtomEntry запись, свойство ClientProperty, Фид AtomFeed, логические includeLinks) в System.Data.Services.Client.AtomMaterializer.MaterializeResolvedEntry (AtomEntry entry, Boolean includeLinks) в System.Data.Services.Client.AtomMaterializer.Materialize (AtomEntry запись, Тип ожидаетсяEntryType, Boolean includeLinks) в System.Data.Services.Client.AtomMaterializer.DirectMaterializePlan (AtomMaterializer материализатор, запись AtomEntry, тип expectedEntryType) в System.Data.Services.Client.AtomMaterializerInvoker.DirectMaterializePlan (Object материализатор, объект ввода, тип expectedEntryType) в System.Data.Services.Client.ProjectionPlan.Run (AtomMaterializer материализатор, запись AtomEntry, тип expectedType) в System.Data.Services.Client.AtomMaterializer.Read () в System.Data.Services.Client.MaterializeAtom.MoveNextInternal () в System.Data.Services.Client.MaterializeAtom.MoveNext () at System.Linq.Enumerable.d__b1 1.MoveNext() at System.Data.Services.Client.DataServiceCollection 1.InternalLoadCollection (IEnumerable 1 items) at System.Data.Services.Client.DataServiceCollection 1.StartTracking (DataServiceContext) контекст, IEnumerable 1 items, String entitySet, Func 2 entityChanged, Func 2 collectionChanged) at System.Data.Services.Client.DataServiceCollection 1..ctor (DataServiceContext контекст, IEnumerable 1 items, TrackingMode trackingMode, String entitySetName, Func 2 entityChangedCallback, Func 2 collectionChangedCallback) at System.Data.Services.Client.DataServiceCollection 1..ctor (IEnumerable 1 items) at Phinli.Dashboard.Silverlight.Helpers.DataHelper.<>c__DisplayClass44.<>c__DisplayClass46.<LoadAllPagesExpandAll>b__43() InnerException: System.InvalidOperationException Message=An item could not be added to the collection. When items in a DataServiceCollection are tracked by the DataServiceContext, new items cannot be added before items have been loaded into the collection. StackTrace: at System.Data.Services.Client.DataServiceCollection 1.InsertItem (Int32) Индекс, Т пункт) at System.Collections.ObjectModel.Collection`1.Add (T вещь) InnerException:

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 15 мая 2010

Я думаю, что проблема здесь заключается в том, что DataServiceCollection не удается добавить загруженные объекты в соответствующие свойства DataServiceCollection типов CMSPage верхнего уровня. Мы делаем специальный случай, чтобы убедиться, что DataServiceCollection можно использовать только после его начального отслеживания некоторые объекты. Я исследую это позже, а пока попробую этот код:

public void LoadAllPagesExpandAll(DataHelperReturnHandler handler, string orderby) 
{ 
  DataServiceCollection<CmsPage> data = new   DataServiceCollection<CmsPage>( _dataservice );

  DataServiceQuery<CmsPage> theQuery = _dataservice 
      .CmsPages 
      .Expand("CmsChildPages") 
      .Expand("CmsParentPage") 
      .Expand("CmsItemState") 
      .AddQueryOption("$orderby", orderby); 

  theQuery.BeginExecute( 
      delegate(IAsyncResult asyncResult) 
      { 
    _callback_dispatcher.BeginInvoke( 
      () => 
      { 
          try 
          { 
        DataServiceQuery<CmsPage> query = asyncResult.AsyncState as DataServiceQuery<CmsPage>; 
        if (query != null) 
        { 
            //create a tracked DataServiceCollection from the result of the asynchronous query. 
            QueryOperationResponse<CmsPage> queryResponse = query.EndExecute(asyncResult) as QueryOperationResponse<CmsPage>; 
            data.Load(queryResponse); 

            handler(data); 
        } 
          } 
          catch 
          { 
        handler(data); 
          } 
      } 
        ); 
      }, 
      theQuery 
  ); 
} 
0 голосов
/ 15 мая 2010

Это немного похоже на ошибку в Data Services.

Я свяжусь с командой по обслуживанию данных и перезвоню вам с ответом.

Может уйти пару дней из-за выходных.

Алекс Джеймс

Службы данных PM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...