如何在WCF数据服务数据上下文对象的DataServiceKey属性中指定多个键

时间:2011-04-21 23:18:17

标签: odata wcf-data-services


我正在为我的WCF数据服务使用Reflection提供程序,我的数据上下文对象有两个关键成员,比如EmpId和DeptId。

如果我指定[DataServiceKey("EmpId", "DeptId")],则该服务不起作用。当我尝试使用URL http://localhost:55389/DataService.svc/EmployeeData访问该集合时,出现以下错误:

  

无法显示XML页面   无法使用XSL样式查看XML输入   片。请更正错误   然后单击“刷新”按钮,或者尝试   稍后再试。以下标签是   未关闭:饲料。处理错误   资源   的 'http://本地主机:55389 / DataService.svc / EmployeeData工作'。

使用DataServiceKey中的单个成员,它可以正常工作。我尝试使用自定义数据提供程序,我可以实现此功能。但是,如果我可以使用Reflection提供程序,那就太棒了。

3 个答案:

答案 0 :(得分:2)

我不认为问题是多个键。要确认请使用例如Fiddler或类似的东西从服务器获取整个响应并在其中共享错误(因为我确信会有一个在那里)。 从描述中猜测我认为问题是你的一个关键属性值是null。这是不受支持的,会引起所谓的插播错误,这会使响应XML不完整(这似乎是你的情况)。

答案 1 :(得分:2)

OData可以处理多个密钥,但所有密钥必须具有有效值。查看this的OData规则。如果要检索EmpId = 1和DeptId = someString的条目,则应将URI重建为:

http://localhost:55389/DataService.svc/EmployeeData(EmpId=1,DeptId='someString')

在OData查询中要小心,因为它们区分大小写。

答案 2 :(得分:1)

这很奇怪,我只是尝试过这个:

public class Context
{
    public IQueryable<Person> People {
        get {
            return (new List<Person> { 
                   new Person { EmpId = 1, DeptId = 2, Name = "Dude" }     
            }).AsQueryable();
        }
    }
}

[DataServiceKey("EmpId", "DeptId")]
public class Person
{
    public int EmpId { get; set; }
    public int DeptId { get; set; }
    public string Name { get; set; }
}

public class WcfDataService1 : DataService<Context>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = 
                 DataServiceProtocolVersion.V2;
    }
}

它运作得很好,你注意到有什么重大差异吗?

-Alex