使用WebAPI,OData v3和BreezeJs继承问题

时间:2015-08-27 12:55:39

标签: entity-framework inheritance odata breeze asp.net-web-api2

我们正在使用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/Carshttps://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。

0 个答案:

没有答案