Привет всем, у меня есть две функции в проекте 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:
Спасибо за любую помощь!