0

我一直在寻找这个问题的答案,但我认为 SO 上的任何人都没有遇到过这个确切的问题。简而言之,我在 C# 中使用反射提供程序来创建一个 odata 服务(就像这样),并且将有两个实体:块和根。

块很像文件系统中的文件和目录,有些可以有子块,有些不能。Root 就像不同的用户帐户,一台设备只能属于一个 Root。这是我到目前为止所拥有的:

类.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>();
    }
}

主文件

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

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

4

1 回答 1

0

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

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

 odata/Block(5)/YourNamespace.ParentBlock/Children
于 2013-08-14T20:17:19.627 回答