WCF数据服务和Azure的表存储:我如何使用PartitionKey / RowKey作为主键(W

2019-09-22 07:38发布

为什么我的实体“人”的下面的代码在我的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属性‘人’,其元素类型不是一个实体类型。 确保IQueryable的属性是实体类型的或指定的IgnoreProperties上的数据上下文类型忽略此属性的属性。“。 请参阅服务器日志的更多细节。 异常堆栈跟踪是:

在System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata(IDictionary的2 knownTypes, IDictionary 2个childTypes,IDictionary的2 entitySets) at System.Data.Services.Providers.BaseServiceProvider.LoadMetadata() at System.Data.Services.DataService 1.CreateMetadataAndQueryProviders (IDataServiceMetadataProvider&metadataProviderInstance,IDataServiceQueryProvider&queryProviderInstance,BaseServiceProvider&builtInProvider,对象&dataSourceInstance)在System.Data.Services.DataService 1.CreateProvider() at System.Data.Services.DataService 1.HandleRequest()在System.Data.Services.DataService`1。 ProcessRequestForMessage(流消息体)在SyncInvokeProcessRequestForMessage(对象,对象[],对象[])中的System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例,对象[]输入,对象[]&输出)在System.ServiceModel.Dispatcher。 DispatchOperationRuntime.InvokeBegin(MessageRpc&RPC)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage 5在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&RPC)(MessageRpc&RPC)在System.ServiceModel.Dispatcher.MessageRpc.Process(布尔isOperationContextSet)

我究竟做错了什么? 如果我添加一个名为是PersonID财产,错误走了,但我需要通过PartitionKey和RowKey访问我的实体,并在班上DataServiceKey装修没有做任何事情。

我使用的Visual Studio 2012,.NET Framework 4.0中,Silverlight的5。

Answer 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; }
    }
}


文章来源: WCF Data Service and Azure Table Storage: How can I use PartitionKey / RowKey as primary keys