我正在通过 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。