我们正在使用WebAPI 2.2,使用OData v3和BreezeJS,并且在使用继承时遇到问题,我们在以下几行中进行了设置(显然对于此问题进行了简化)
我们有一个Vehicle抽象类,然后是另外两个继承自Vehicle的类(Bus和Car),例如:
public abstract class Vehicle
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Bus : Vehicle
{
public int NumberOfSeats { get; set; }
}
public class Car : Vehicle
{
public string Colour { get; set; }
}
然后我们有一个Activity类,它可以有一个Vehicle(Car或Bus):
public class Activity
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime DueDate { get; set; }
public int VehicleId { get; set; }
public virtual Vehicle Vehicle { get; set; }
}
我们希望能够查询Activity并扩展其Vehicle并获得相关的汽车或巴士,例如https://dummysitename/api/Activities?$expand=Vehicle
,这是正常的。我们还希望能够对汽车和公共汽车的终点进行GET / PATCH / POST(例如https://dummysitename/api/Cars
和https://dummysitename/api/Buses
),但是在尝试执行此操作时我们会得到404.
我们的元数据是由微风EdmBuilder创建的。我们已经测试过它不是使用EdmBuilder而是使用ODataConventionModelBuilder并且适用于这些场景,但是对于我们来说,在宏伟的方案中显然没有用,因为我们将大量使用breeze.js。
有关我们在使用EdmBuilder时无法使用Cars和Buses端点的任何想法,我们将不胜感激。
更新 似乎问题是由Activity类规定的车辆引起的。对于Activity类上的Vehicle,元数据的EntityContainer部分如下所示:
<EntityContainer Name="TodoListContext" p5:UseClrTypes="true" xmlns:p5="http://schemas.microsoft.com/ado/2013/11/edm/customannotation">
<EntitySet Name="Activities" EntityType="ODataBreezejsSample.Models.Activity" />
<EntitySet Name="Vehicles" EntityType="ODataBreezejsSample.Models.Vehicle" />
<AssociationSet Name="Activity_Vehicle" Association="ODataBreezejsSample.Models.Activity_Vehicle">
<End Role="Activity_Vehicle_Source" EntitySet="Activities" />
<End Role="Activity_Vehicle_Target" EntitySet="Vehicles" />
</AssociationSet>
</EntityContainer>
但是如果从Activity类中删除了Vehicle,那么相同的部分如下所示:
<EntityContainer Name="TodoListContext" p5:UseClrTypes="true" xmlns:p5="http://schemas.microsoft.com/ado/2013/11/edm/customannotation">
<EntitySet Name="Activities" EntityType="ODataBreezejsSample.Models.Activity" />
<EntitySet Name="Buses" EntityType="ODataBreezejsSample.Models.Bus" />
<EntitySet Name="Cars" EntityType="ODataBreezejsSample.Models.Car" />
</EntityContainer>
此时Bus和Car端点可用,但这不是一个选项,因为我们要求Activity包含基类Vehicle。