我在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();
    }
}

最佳答案

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

关于c# - Odata V4 $ Select在一对一关系上展开后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51877494/

10-16 19:33