0

我正在通過OData(WCF數據服務)使用Azure表存儲訪問「Person」實體。我有很多問題需要解決。我是有這個錯誤:通過OData訪問的Azure表存儲實體。 PartitionKey和RowKey作爲主鍵

實體代碼:

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

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

結果:

The server encountered an error processing the request. The exception message is 'On data context type 'PersonDataServiceContext', there is a top IQueryable property 'Person' whose element type is not an entity type. Make sure that the IQueryable property is of entity type or specify the IgnoreProperties attribute on the data context type to ignore this property.'.

經過很多故障排除後,我通過這個post發現,爲了解決這個錯誤,我發現d添加到我的實體:

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(來自TableServiceE ntity),但使用此代碼沒有幫助:

[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。

回答

0

按照WCF Data Service and Azure Table Storage: How can I use PartitionKey/RowKey as primary keys ...

這似乎是在思考提供商的限制,可能不是預期的限制。我會將其作爲內部錯誤進行存檔,但這是一種解決方法,直到我們得到修復爲止......

可以使用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; } 
    } 
} 
相關問題