0

为什么我的实体“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, IDictionary2 childTypes, IDictionary 1.CreateMetadataAndQueryProviders 2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.LoadMetadata() at System.Data.Services.DataService(IDataServiceMetadataProvider& metadataProviderInstance, IDataServiceQueryProvider& queryProviderInstance, BaseServiceProvider& builtInProvider, Object& dataSourceInstance) 在 System.Data.Services.DataService1.CreateProvider() at System.Data.Services.DataService1.HandleRequest() 在 System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody) 在 SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] ) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[ ] 在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 的输入,Object[]& 输出) ) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

我究竟做错了什么?如果我添加一个名为 PersonID 的属性,错误就消失了,但是我需要通过 PartitionKey 和 RowKey 来访问我的实体,并且类中的 DataServiceKey 装饰没有做任何事情。

我正在使用 Visual Studio 2012、.NET Framework 4.0、Silverlight 5。

4

1 回答 1

1

这似乎是反射提供程序的限制,可能不是预期的限制。我将在内部将此作为错误提交,但在我们修复之前,这里有一个解决方法......

您可以使用new 修饰符隐藏通过/从基类传递所需的值:

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; }
    }
}
于 2012-09-17T16:51:33.633 回答