Odata V4 $ Select在一对一关系上展开后

时间:2018-08-16 12:48:44

标签: c# asp.net-web-api odata

我在EntityFramework 6.0下使用WebAPI(Microsoft.ASPNet.WebApi 5.2.4.net Framework)下的Microsoft Odata v4(Microsoft.ASPNet.OData 7.0.1)实现,无法确定我做错了什么,或Microsoft的实现不支持该功能。如果不支持,如何实现自我?

我有两个具有一对一关系的实体。 (说Employee和EmployeeDetails)。

http://localhost/odata/Employee?$expand=EmployeeDetails工作正常。
但是http://localhost/odata/Employee?$expand=EmployeeDetails($select=Foo)失败,并显示“在URI中指定的查询无效。在$ select查询选项中不能使用属性'Foo'。”

实体类的定义如下:

public partial class Employee
{
    [Key]
    public int EmployeeID {get;set;}
    [ForeignKey{"EmployeeDetail"}]
    public int EmployeeDetailsID {get;set;}


}
public partial class EmployeeDetail
{
    [Key]
    public int EmployeeDetailsID {get;set;}
    public string Foo {get;set;}
    public string Fum {get;set;}
}

控制器很简单:

EFModel _db = new EFModel();

    [EnableQuery(PageSize = 20,MaxExpansionDepth = 4,AllowedQueryOptions = AllowedQueryOptions.All)]
    public IQueryable<Employee> Get()
    {
        return _db.Employees;
    }
    [EnableQuery(PageSize = 20,MaxExpansionDepth = 4,AllowedQueryOptions = AllowedQueryOptions.All)]
    public IQueryable<Employee> GetEmployees()
    {
        return _db.Employees;
    }

使用传统的modelBuilder,我已经允许过滤,在两个实体上展开。

因为我的“员工”数据非常广泛,并且希望拥有多个一对一的关系,所以不愿单看。

配置代码

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
       config.MapODataServiceRoute("odata", "odata", ModelBuilder.GetEdmModel())
    }
}

模型构建器类

public static class ModelBuilder
{
    public static IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        var EmployeeEntity = builder.EntitySet<Employee>("Employees");
        EmployeeEntity.EntityType.Filter().Expand().Select().Count();

        var EmployeeDetailEntity = builder.EntitySet<EmployeeDetail>("EmployeeDetails");
        EmployeeDetailEntity.EntityType.Filter().Expand().Select().Count();

        return builder.GetEdmModel();
    }
}

1 个答案:

答案 0 :(得分:0)

如前所述,上述示例代码代码经过细微的更正以及放回到示例项目中时都可以使用。此后,我重建了原始项目,现在认为问题出在原始代码中是错误/错别字。