为什么我的实体“Person”的以下代码在我的WCF数据服务中生成错误:
[System.Data.Services.Common.DataServiceKey("PartitionKey", "RowKey")]
public class Person : TableServiceEntity
{
public string Name { get; set; }
public int Age { get; set; }
... etc
错误:
请求错误
服务器在处理请求时遇到错误。例外 消息是'在数据上下文类型'PersonDataServiceContext',有 顶级IQueryable属性'Person',其元素类型不是实体 类型。确保IQueryable属性是实体类型或 将数据上下文类型指定为IgnoreProperties属性 忽略这个属性。'请参阅服务器日志以获取更多详该 异常堆栈跟踪是:
在 System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata(IDictionary
2 knownTypes, IDictionary
2 childTypes,IDictionary2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.LoadMetadata() at System.Data.Services.DataService
1.CreateMetadataAndQueryProviders(IDataServiceMetadataProvider& metadataProviderInstance,IDataServiceQueryProvider& queryProviderInstance,BaseServiceProvider& builtInProvider,Object& dataSourceInstance)at System.Data.Services.DataService1.CreateProvider() at System.Data.Services.DataService
1.HandleRequest()at System.Data.Services.DataService`1.ProcessRequestForMessage(流 messageBody)在SyncInvokeProcessRequestForMessage(Object,Object [], 对象[])在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,对象[]输入,对象[]&输出) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培; rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
我做错了什么? 如果我添加一个名为PersonID的属性,则错误消失,但我需要通过PartitionKey和RowKey访问我的实体,并且类中的DataServiceKey修饰没有做任何事情。
我正在使用Visual Studio 2012,.NET Framework 4.0,Silverlight 5。
答案 0 :(得分:1)
这似乎是反射提供者的限制,可能不是预期的限制。我会在内部将此文件作为错误提交,但这是一个解决方法,直到我们进行修复...
您可以使用new modifier隐藏通过基类传递所需的值:
using System;
using System.Data.Services.Common;
namespace SO.OData
{
[DataServiceKey("PartitionKey", "RowKey")]
public class Question : TableServiceEntry
{
public new string PartitionKey
{
get { return base.PartitionKey; }
set { base.PartitionKey = value; }
}
public new string RowKey
{
get { return base.RowKey; }
set { base.RowKey = value; }
}
public string Text { get; set; }
public User AskedBy { get; set; }
public DateTimeOffset AskedAt { get; set; }
}
public abstract class TableServiceEntry
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
}
}