如何使用OData为EF核心无密钥实体(数据库视图)公开Querable API?

时间:2020-03-25 11:11:01

标签: rest odata asp.net-core-3.1 ef-core-3.1

我正在使用https://www.nuget.org/packages/Microsoft.AspNetCore.OData/7.3.0使用ASP.NET Core 3.1 API公开基于OData 4的Querable API

当我尝试使用基于OData Convention的模型公开它时,我具有带有无键实体(数据库视图)的EF Data上下文

   modelBuilder
   .Entity<Student>(eb =>
    {
        eb.HasNoKey();
        eb.ToView("vw_students", "public");
    });

这是我的具有EF Core实体类型的OData EDM模型映射

var edmBuilder = new ODataConventionModelBuilder();
edmBuilder.EntitySet<Student>("Students");       
return edmBuilder.GetEdmModel();

我在此行上出错edmBuilder.GetEdmModel()实体集“ Students”基于未定义键的类型“ ODataCore31.Student”。

我的问题- 1)OData模型本身支持无密钥实体类型吗? 2)有解决方法吗?

1 个答案:

答案 0 :(得分:0)

OData的Edm Model Builder似乎显然不支持无键实体: https://github.com/OData/ModelBuilder/blob/86d26d7346e9359e64e5ec08c31ac7e829cbe788/src/Microsoft.OData.ModelBuilder/ODataModelBuilder.cs#L629

因此,暂时第一个问题的答案是“否”。

对于第二个问题,这在您的用例中可能是不可能的,但是如果您的无键实体对应于数据库中的视图,则实际上您可以仅建立一个普通的(非无键)实体(如果存在列或列的组合)此视图上的列是唯一的。在我的一个模型中,我创建了一个与数据库视图相对应的实体类,然后将[Key]属性添加到该视图的列上的属性中,该属性保证每个记录都是唯一的。然后,OData会像对待其他任何实体一样对待它。唯一需要注意的是它是只读的。

另一方面,如果您想将无键实体浮现到OData,因为它从多个数据库表/视图中拉出列(就像您可以在经典EF中使用defining query一样),而您不想在数据库中创建新视图,我认为您很走运。