我一直在寻找这个问题的答案,但我认为 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
,但只有其中一个是可导航的。我很感激任何帮助!ParentBlock
Children