我一直在寻找这个问题的答案,但我认为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个),但我无法导航到它们?我确定我有一些非常明显的东西,但我还没有找到它。更令人费解的是,Root
和ParentBlock
在将Children
列表提供给外部类时具有相同的代码,但只有其中一个可导航。我很感激任何帮助!
答案 0 :(得分:0)
在您的模型中,Block
类型没有名为Children
的属性。您的意思是在ParentBlock
实体集和Block
属性中引用Blocks
而不是Root.Children
吗?
或者,如果您知道Block(5)
恰好是ParentBlock
,则可以在访问其Children
属性之前将其强制转换。例如:
odata/Block(5)/YourNamespace.ParentBlock/Children