【发布时间】:2011-02-18 00:51:27
【问题描述】:
大家好,我在一个 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
);
}
很明显,问题在于涉及自引用关系的展开投影(页面可以包含其他页面)。这是在 SL4 或 SL3 下使用 ADONETDataServices SL3 Update CTP3。
我愿意接受任何解决方法或指向 goo 信息的指针,Google 搜索错误会导致两次命中,我无法破译这两个结果都不是特别有用。
简短的错误是“无法将项目添加到集合中。当 DataServiceCollection 中的项目由 DataServiceContext 跟踪时,在项目加载到集合中之前无法添加新项目。”
完整的错误是...
System.Reflection.TargetInvocationException 被捕获 Message=Exception has 被目标抛出 调用。堆栈跟踪: 在 System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo 方法,对象目标,对象[] 参数,SignatureStruct& sig, 方法属性方法属性, RuntimeType typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo 文化,布尔值 跳过可见性检查) 在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj、BindingFlags、invokeAttr、Binder 活页夹,Object[] 参数, CultureInfo文化) 在 System.Reflection.MethodBase.Invoke(对象 obj, Object[] 参数) 在 System.Data.Services.Client.ClientType.ClientProperty.SetValue(对象 实例,对象值,字符串 propertyName,布尔值允许添加) 在 System.Data.Services.Client.AtomMaterializer.ApplyItemsToCollection(AtomEntry 条目,ClientProperty 属性, IEnumerable items, Uri nextLink, ProjectionPlan continuationPlan) 在 System.Data.Services.Client.AtomMaterializer.ApplyFeedToCollection(AtomEntry 条目,ClientProperty 属性, AtomFeed 提要,布尔包含链接) 在 System.Data.Services.Client.AtomMaterializer.MaterializeResolvedEntry(AtomEntry 条目,布尔包含链接) 在 System.Data.Services.Client.AtomMaterializer.Materialize(AtomEntry 条目,类型 expectedEntryType,布尔值 包括链接) 在 System.Data.Services.Client.AtomMaterializer.DirectMaterializePlan(AtomMaterializer 物化器,AtomEntry 条目,类型 预期条目类型) 在 System.Data.Services.Client.AtomMaterializerInvoker.DirectMaterializePlan(对象 物化器,对象条目,类型 预期条目类型) 在 System.Data.Services.Client.ProjectionPlan.Run(AtomMaterializer 物化器,AtomEntry 条目,类型 预期类型) 在 System.Data.Services.Client.AtomMaterializer.Read() 在 System.Data.Services.Client.MaterializeAtom.MoveNextInternal() 在 System.Data.Services.Client.MaterializeAtom.MoveNext() 在 System.Linq.Enumerable.d__b1
1.MoveNext() at System.Data.Services.Client.DataServiceCollection1.InternalLoadCollection(IEnumerable1 items) at System.Data.Services.Client.DataServiceCollection1.StartTracking(DataServiceContext 上下文,IEnumerable1 items, String entitySet, Func2 entityChanged, Func2 collectionChanged) at System.Data.Services.Client.DataServiceCollection1..ctor(DataServiceContext 上下文,IEnumerable1 items, TrackingMode trackingMode, String entitySetName, Func2 entityChangedCallback, Func2 collectionChangedCallback) at System.Data.Services.Client.DataServiceCollection1..ctor(IEnumerable1 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.DataServiceCollection1.InsertItem(Int32 索引,T 项) 在 System.Collections.ObjectModel.Collection`1.Add(T 物品) 内部异常:
感谢您的帮助!
【问题讨论】:
标签: c# silverlight silverlight-4.0 silverlight-3.0 wcf-data-services