2014-04-05 84 views
0

根據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> 
+0

如何在元數據中定義Car?你能否用'Car'和'Vehicle'類的元數據短片段更新你的問題?最終,如有必要,您可以使用客戶端編碼元數據修復損壞。但如果可以的話,最好在服務器上生成正確的元數據。 – Ward

+0

@Ward:已更新爲包含示例模型的元數據。 – Arash

回答

0

對我而言,脫穎而出的是EDMX概念模型中缺少Cars「EntitySet」,因此也從EdmBuilder生成的元數據中缺少了「EntitySet」。 OTOH,當您撥打ODataConventionModelBuilder時,您包含Cars

你不是真的在談論同一個「模型」。

我想(希望)如果您將Cars「EntitySet」添加到DbContext,您將獲得期望的結果。

+0

這個示例是一個模型的第一個EF上下文,所以我想這是設計。因爲派生類型(Car)顯示在edmx設計器上,但它不包含爲EntitySet。我也用代碼第一個dbcontext檢查了它。將「Cars」作爲EntitySet包含在內沒有任何作用。 – Arash

+0

這只是沒有意義。我認爲這是一個我們可以輕鬆加載和理解的小樣本。如果是這樣,你會把它放在我們可以下載並嘗試的地方嗎?我們需要真實的代碼。謝謝。 – Ward