Odata Navigation属性导致404错误

时间:2013-08-13 19:16:09

标签: c# odata

我一直在寻找这个问题的答案,但我认为SO上的任何人都没有遇到过这个问题。真的很简单,我在C#中使用反射提供程序来创建一个odata服务(like so),并且将有两个实体:Blocks和Roots。

块与文件系统中的文件和目录非常相似,有些可以有子块,有些则不能。根就像不同的用户帐户,设备只能属于一个Root。这是我到目前为止所做的:

Classes.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization; 
using System.Data.Services.Common;
using System.Data.Services;

[DataServiceEntity]
public class Block
{
    public string Name { set; get; }
    public int ID { set; get; }
    public int PID { set; get; }
}

public class ParentBlock : Block
{
    public List<Block> Children { set; get; }

    public int Count { get { return Children.Count(); } }

    public ParentBlock()
    {
        Children = new List<Block>();
    }
}

/*other classes that inherit from Block or ParentBlock*/

[DataServiceEntity]
[DataServiceKey("User")]
public class Root
{
    public string User { set; get; }
    public int ID { set; get; }

    public List<Block> Children { set; get; }

    public Root()
    {
        Children = new List<Block>();
    }
}

Main.cs

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class RootDataService : DataService<RootService>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.UseVerboseErrors = true;
        config.DataServiceBehavior.MaxProtocolVersion = System.Data.Services.Common.DataServiceProtocolVersion.V2;
    }
}

public class RootService
{
    private List<Root> RootList = new List<Root>();
    private List<Block> BlockList = new List<Block>();

    public RootService()
    {
        /*initializes RootList and BlockList with test data*/
    }

    public IQueryable<Root> Roots
    {
        get
        {
            return RootList.AsQueryable<Root>();
        }
    }

    public IQueryable<Block> Blocks
    {
        get
        {
           return BlockList.AsQueryable<Block>();
        }
    }
}

这一切都很好。我运行程序,导航到我的浏览器,我得到两个集合,根和块。我可以做odata / Roots来获得测试帐户,odata / Roots('account1')以获得第一个帐户的用户和ID。我可以做odata / Roots('account1')/ Children(5)并获得ID为5的Block。

但是......当我尝试做odata / Roots('account1')/ Children(5)/ Children或odata / Block(5)/ Children时,我得到了404.这是令人沮丧的,因为我添加了验证码到我的RootService构造函数和Count属性显示Block(5)有子项(其中2个),但我无法导航到它们?我确定我有一些非常明显的东西,但我还没有找到它。更令人费解的是,RootParentBlock在将Children列表提供给外部类时具有相同的代码,但只有其中一个可导航。我很感激任何帮助!

1 个答案:

答案 0 :(得分:0)

在您的模型中,Block类型没有名为Children的属性。您的意思是在ParentBlock实体集和Block属性中引用Blocks而不是Root.Children吗?

或者,如果您知道Block(5)恰好是ParentBlock,则可以在访问其Children属性之前将其强制转换。例如:

 odata/Block(5)/YourNamespace.ParentBlock/Children