【发布时间】: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