0

我正在通过 OData(WCF 数据服务)使用 Azure 表存储访问“人员”实体。我有很多问题要让它发挥作用。我遇到了这个错误:

实体代码:

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

这是一个非常接近您正在尝试的示例

Windows Azure 演练:表存储

了解表服务数据模型

每个条目都有一个 PartitionKey 和一个 RowKey,并且组合必须是唯一的。基于第一个链接,rowkey 可以是 string.empty。

于 2012-09-10T19:33:30.667 回答
0

根据WCF 数据服务和 Azure 表存储:如何使用 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 回答