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

时间:2012-09-11 19:38:58

标签: .net wcf-data-services visual-studio-2012 odata azure-table-storage

为什么我的实体“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,IDictionary 2 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.DataService 1.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。

1 个答案:

答案 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; }
    }
}