【问题标题】:Odata V4 $Select after $expand on One to One relationshipOdata V4 $Select after $expand on one to one 关系
【发布时间】:2018-08-16 12:48:44
【问题描述】:

我在 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 中指定的查询无效。属性 'Foo' 不能在 $select 查询选项中使用。”

实体类的定义如下:

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;
    }

使用我允许过滤、扩展两个实体的常规模型构建器。

不希望使用单一视图,因为我的“员工”数据非常广泛,并且希望有多个一对一的关系。

配置代码

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

【问题讨论】:

  • http://localhost/odata/Employee?$select=EmployeeID 有效吗? OData WebApi版本和配置代码是多少?
  • @Pagotti。更新示例。包括 GetEmployees 处理您的代码示例。
  • 我复制了您的代码并为我工作。唯一的区别是我将模型更改为添加public EmployeeDetail EmployeeDetails { get; set; } 并将外键属性修复为[ForeignKey("EmployeeDetails")]。我不明白为什么你的代码不起作用。
  • @Pagotti。谢谢,我重建了,它似乎正在工作。我的原始代码中一定有错字或某些东西,没有翻译成我放在一起的示例代码。您确实通过确认它应该可以工作来帮助我。

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


【解决方案1】:

如前所述,上面的示例代码代码在稍作修正后可以正常工作,并且在放回示例项目中时。我已经重建了我的原始项目,现在认为这个问题是我原始代码中的一个错误/错字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2020-10-20
    • 2017-02-27
    相关资源
    最近更新 更多