0

OData (WCF Data Service) 経由で Azure Table Storage を使用して "Person" エンティティにアクセスしています。これを機能させるには多くの問題がありました。私はこのエラーを抱えていました:

エンティティ コード:

public class Person : TableServiceEntity
{
public string Name { get; set; }
... etc

URI: http://127.0.0.1/DataService/PersonDataService.svc/Person

結果:

サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「データ コンテキスト タイプ 'PersonDataServiceContext' で、要素タイプがエンティティ タイプではない最上位の IQueryable プロパティ 'Person' があります。IQueryable プロパティがエンティティ タイプであることを確認するか、データ コンテキスト タイプで IgnoreProperties 属性を指定して、このプロパティを無視してください。

多くのトラブルシューティングの後、この投稿を通じて、このエラーを回避するためにエンティティに追加できることがわかりました。

1) カスタム キーを追加するための [DataServiceKey] 属性 ([DataServiceKey("PartitionKey", "RowKey")] が必要です)

2)「PersonID」プロパティを探すことによって(これは私のために働く唯一のものです)

3) 「ID」プロパティを探すことによって

いいえ 1 は、私のために働く唯一のものです。次のように、「PersonID」列を追加する必要がありました。

エンティティ コード:

public class Person : TableServiceEntity
{
public Guid PersonID { get; set; } //This is absolutely necessary to get around the aforementioned error
public string Name { get; set; }
... etc

http://127.0.0.1/DataService/PersonDataService.svc/Personを介して、または PersonID: http://127.0.0.1/DataService/PersonDataService.svc/Person(guid'e4a924d1-a564-45d7- 9e3e-fe0396d08f8e')

PartitionKey/RowKey (TableServiceEntity から取得) などのカスタム主キー列を指定したいのですが、このコードを使用しても役に立ちません。

[DataServiceKey("PartitionKey", "RowKey")]
public class Person : TableServiceEntity
{
public string Name { get; set; }
... etc

これはバグですか?私が持っているすべてのエンティティについて、その規則に従う必要がありますか? Person => PersonID、Foo => FooID など。

Visual Studio 2012 と Silverlight 5、.NET Framework 4.0 を使用しています。

4

2 に答える 2

0

WCF Data Service および Azure Table Storageに従って: PartitionKey / RowKey を主キーとして使用するにはどうすればよいですか...

これはリフレクション プロバイダの制限であり、意図した制限ではないようです。これは内部でバグとして報告しますが、修正に至るまでの回避策は次のとおりです...

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-17T17:13:50.137 に答える
0

これは、あなたがしようとしているものにかなり近いサンプルです

Windows Azure チュートリアル: テーブル ストレージ

テーブル サービス データ モデルについて

すべてのエントリには PartitionKey と RowKey があり、その組み合わせは一意でなければなりません。最初のリンクに基づいて、行キーを string.empty にすることができます。

于 2012-09-10T19:33:30.667 に答える