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[ ] 入力、Object[]& 出力) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) ) 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 に答える