c# - ASP.NET C# OData 服务 + 导航属性 + $expand = null。我错过了什么?
问题描述
我将尝试用一个简化的例子尽可能彻底地解释我的问题。请注意,我没有使用实体框架。
我有这个模型:
public class Person
{
[Key]
public Guid Id { get; set; }
public string GivenName { get; set; }
public string FamilyName { get; set; }
public List<Employment> Employments { get; set; }
}
public class Employment
{
public string Role { get; set; }
public Guid? ManagerId { get; set; }
public virtual Person Manager { get; set; }
}
我创建了一个内存数据源:
public class MyDataSource
{
private static MyDataSource instance = null;
public static MyDataSource Instance
{
get
{
if (instance == null)
{
instance = new MyDataSource();
}
return instance;
}
}
public List<Person> Persons { get; set; }
private MyDataSource()
{
this.Persons = new List<Person>();
this.Persons.AddRange(new List<Person>
{
new Person()
{
Id = Guid.Parse("00000000-0000-0000-0000-000000000001"), //Just for simplicity
GivenName = "John",
FamilyName = "Doe",
Employments = new List<Employment>()
{
new Employment()
{
Role = "Boss"
}
}
},
new Person()
{
Id = Guid.Parse("00000000-0000-0000-0000-000000000002"), //Just for simplicity
GivenName = "Clark",
FamilyName = "Kent",
Employments = new List<Employment>()
{
new Employment()
{
Role = "Worker",
ManagerId = Guid.Parse("00000000-0000-0000-0000-000000000001"), //Just for simplicity
}
}
}
});
}
}
我有这个控制器:
[EnableQuery]
public class PersonsController : ODataController
{
public IHttpActionResult Get()
{
return Ok(MyDataSource.Instance.Persons)
}
}
我配置端点:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapODataServiceRoute("ODataRoute", "odata", CreateEdmModel());
config.Select().Expand().Filter().OrderBy().MaxTop(null).Count()
}
public static IEdmModel CreateEdmModel()
{
var builder = new ODataConventionModelBuilder();
var persons = builder.EntitySet<Person>("Persons");
builder.ComplexType<Employment>().HasOptional(e => e.Manager, (e, p) => e.ManagerId == p.Id);
return builder.GetEdmModel();
}
}
检查 $metadata 我看到了这个:
<NavigationProperty Name="Manager" Type = "MyNamespace.Person">
<ReferentialConstraint Property="ManagerId" ReferenceProperty="Id" />
</NavigationProperty
据我所知,一切看起来都很好,但是:
https://example.com/odata/persons?$expand=Employments/Manager
一切正常,但是:
两个人的经理都是空的。我期待看到 John Doe 在 Clark Kents 的工作。
我错过了什么?
解决方案
我自己解决了。
我意识到它不像我想的那样工作,我必须直接在 MyDataSource 中添加对管理器的引用。之后,它可以 $expand 管理器。
推荐阅读
- keycloak - Keycloak 条款和条件版本控制
- python - 如何获取数据框中每一行对应的计数并在 python 中以百分比形式获取个人贡献?
- firebase - 不同 Play 管理中心帐户的应用使用相同的 firebase 帐户?
- javascript - imdecode 在 mac os 设备中的烧瓶上不返回任何内容
- textfield - 有没有办法在大纲文本字段 jetpack compose 中更改特定单词的背景颜色?
- javascript - 如何从 firebase (v9.0.0) 数据库中存储和检索数据
- android - 如何让 VideoView 播放带有 Drive 链接的视频?
- flask - 烧瓶:@response.call_on_close 在测试时不起作用
- python - 在python中随着时间的推移加载大音频文件
- javascript - 为什么这个 jquery 函数不能切换当前的导航栏部分类工作?