根據this sample,我使用帶有WebApi OData的breezejs。正如本文所述,由於缺少外鍵信息,我無法使用ODataConventionModelBuilder。假設我有一個名爲'Car'的實體,它來自一個名爲'Vehicle'的實體。隨着ODataConventionModelBuilder我可以定義模型像這樣:breezejs和ASP.NET Web Api中的實體框架繼承OData
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Vehicle>("Vehicles");
builder.EntitySet<Car>("Cars");
我可以做查詢,如:
- /的OData /車輛 - >返回所有的車輛。
- /odata /汽車 - >返回 只是汽車。
但是用Breeze EdmBuilder類,我只能使用'/ odata/Vehicles'查詢。 '/ odata/Cars'會導致'404 not found'錯誤。
似乎在使用'ODataConventionModelBuilder'時,'Cars'實體集在元數據中定義,但在使用微風EdmBuilder時,它不是。向元數據終點('odata/$ metadata')發送請求時,我可以確認此行爲。這發生在this question中所述的代碼優先和模型優先方法中。
總之,如何在微風和Web Api OData中使用EdmBuilder類時使用繼承。
使用 'ODataConventionModelBuilder' 時進行更新
這裏是元數據:
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="TestDBModel">
<EntityType Name="Car" BaseType="TestDBModel.Vehicle">
<Property Name="Capacity" Type="Edm.Int32" Nullable="false"/>
</EntityType>
<EntityType Name="Vehicle">
<Key>
<PropertyRef Name="VehicleId"/>
</Key>
<Property xmlns:p6="http://schemas.microsoft.com/ado/2009/02/edm/annotation" Name="VehicleId" Type="Edm.Int32" Nullable="false" p6:StoreGeneratedPattern="Identity"/>
<Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true"/>
</EntityType>
<EntityContainer xmlns:p5="http://schemas.microsoft.com/ado/2009/02/edm/annotation" Name="TestDBEntities" p5:LazyLoadingEnabled="true">
<EntitySet Name="Vehicles" EntityType="TestDBModel.Vehicle"/>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
這裏是概念模型部分:
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="EFTest.Models">
<EntityType Name="Vehicle">
<Key>
<PropertyRef Name="VehicleId"/>
</Key>
<Property Name="VehicleId" Type="Edm.Int32" Nullable="false"/>
<Property Name="Name" Type="Edm.String"/>
</EntityType>
<EntityType Name="Car" BaseType="EFTest.Models.Vehicle">
<Property Name="Capacity" Type="Edm.Int32" Nullable="false"/>
</EntityType>
</Schema>
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="Default">
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Vehicles" EntityType="EFTest.Models.Vehicle"/>
<EntitySet Name="Cars" EntityType="EFTest.Models.Car"/>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
這裏使用微風EdmBuilder類時是元數據在edmx文件中:
<edmx:ConceptualModels>
<Schema Namespace="TestDBModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="Car" BaseType="TestDBModel.Vehicle">
<Property Name="Capacity" Type="Int32" Nullable="false" />
</EntityType>
<EntityType Name="Vehicle">
<Key>
<PropertyRef Name="VehicleId" />
</Key>
<Property Name="VehicleId" Nullable="false" annotation:StoreGeneratedPattern="Identity" Type="Int32" />
<Property Name="Name" Type="String" MaxLength="50" FixedLength="false" Unicode="true" Nullable="false" />
</EntityType>
<EntityContainer Name="TestDBEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Vehicles" EntityType="Self.Vehicle" />
</EntityContainer>
</Schema>
</edmx:ConceptualModels>
如何在元數據中定義Car?你能否用'Car'和'Vehicle'類的元數據短片段更新你的問題?最終,如有必要,您可以使用客戶端編碼元數據修復損壞。但如果可以的話,最好在服務器上生成正確的元數據。 – Ward
@Ward:已更新爲包含示例模型的元數據。 – Arash