首页 > 解决方案 > 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 的工作。

我错过了什么?

标签: c#asp.netasp.net-web-apiodata

解决方案


我自己解决了。

我意识到它不像我想的那样工作,我必须直接在 MyDataSource 中添加对管理器的引用。之后,它可以 $expand 管理器。


推荐阅读