我想在編寫(1.4.6)Web API 2(ODataController)時使用最新版本的Breeze。我的問題是來自Breeze的結果缺少導航屬性。Breeze 1.4.6 + Web API 2 OData - 導航屬性丟失
考慮以下幾點:
public class Country : EntityBase<long>
{
public Country()
{
Provinces = new List<Province>();
}
[Required]
[StringLength(256)]
public string Name { get; set; }
[Required]
[StringLength(3)]
public string Abbreviation { get; set; }
// Navigation Properties
[InverseProperty("Country")]
public virtual ICollection<Province> Provinces { get; set; }
}
public class Province : EntityBase<long>
{
[Required]
[StringLength(256)]
public string Name { get; set; }
[Required]
[StringLength(3)]
public string Abbreviation { get; set; }
public long CountryId { get; set; }
[ForeignKey("CountryId")]
[InverseProperty("Provinces")]
public virtual Country Country { get; set; }
}
然後我架式出ODataController使用VS 2013國家,並確保我WebApiConfig被正確的更新:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Country>("Countries");
builder.EntitySet<Province>("Provinces");
builder.Namespace = "MyNamespace.Models";
var batchHandler = new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer);
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel(), batchHandler);
在這一點上我能針對我的數據成功運行查詢。 ?
http://mysite.local/Api/odata/Countries $展開;各省
這將返回你所期望的:
{
"odata.metadata":"http://mysite.local/Api/odata/$metadata#Countries","value":[
{
"Provinces":[
{
"Name":"Alberta","Abbreviation":"AB","CountryId":"1","Id":"1"
},{
"Name":"British Columbia","Abbreviation":"BC","CountryId":"1","Id":"2"
},{
"Name":"Manitoba","Abbreviation":"MB","CountryId":"1","Id":"3"
},{
"Name":"New Brunswick","Abbreviation":"NB","CountryId":"1","Id":"4"
}
// edited for brevity
],"Name":"Canada","Abbreviation":"CA","Id":"1"
}
}
現在我已經準備好開始消費客戶端上的這一數據。我連接datajs/Breeze並配置微風使用OData。下面是我使用的配置和創建微風經理什麼:
function configureBreezeManager() {
breeze.config.initializeAdapterInstances({
dataService: 'OData'
});
breeze.NamingConvention.camelCase.setAsDefault();
var mgr = new breeze.EntityManager('http://mysite.local/api/odata');
return mgr;
}
然後我試圖做一個簡單的查詢:
var query = breeze.EntityQuery.from('Countries').expand('Province').orderBy('name');
此查詢成功,我也得到了幾個國家對象的結果(加拿大&美國),但它缺少省份的導航屬性。其他數據(id,名稱,縮寫)都按預期方式出現。我也嘗試了這一點,並查詢各省和擴大國家,並得到相同的結果(沒有導航屬性)。
我可以看到Breeze正確追加了$ expand,請求url是我所期望的。
我讀過OData缺少Breeze需要的外鍵信息,但Breeze 1.4.4添加了對OData v3的支持,所以我不確定這是否應該工作?
謝謝。
編輯:這是在的情況下產生的元數據可以幫助:
<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="MyNamespace.Models">
<EntityType Name="Country">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Name" Type="Edm.String" Nullable="false"/>
<Property Name="Abbreviation" Type="Edm.String" Nullable="false"/>
<Property Name="Id" Type="Edm.Int64" Nullable="false"/>
<NavigationProperty Name="Provinces" Relationship="MyNamespace.Models.MyNamespace_Models_Country_Provinces_MyNamespace_Models_Province_ProvincesPartner" ToRole="Provinces" FromRole="ProvincesPartner"/>
</EntityType>
<EntityType Name="Province">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Name" Type="Edm.String" Nullable="false"/>
<Property Name="Abbreviation" Type="Edm.String" Nullable="false"/>
<Property Name="CountryId" Type="Edm.Int64" Nullable="false"/>
<Property Name="Id" Type="Edm.Int64" Nullable="false"/>
<NavigationProperty Name="Country" Relationship="MyNamespace.Models.MyNamespace_Models_Province_Country_MyNamespace_Models_Country_CountryPartner" ToRole="Country" FromRole="CountryPartner"/>
</EntityType>
<Association Name="MyNamespace_Models_Country_Provinces_MyNamespace_Models_Province_ProvincesPartner">
<End Type="MyNamespace.Models.Province" Role="Provinces" Multiplicity="*"/>
<End Type="MyNamespace.Models.Country" Role="ProvincesPartner" Multiplicity="0..1"/>
</Association>
<Association Name="MyNamespace_Models_Province_Country_MyNamespace_Models_Country_CountryPartner">
<End Type="MyNamespace.Models.Country" Role="Country" Multiplicity="0..1"/>
<End Type="MyNamespace.Models.Province" Role="CountryPartner" Multiplicity="0..1"/>
</Association>
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Countries" EntityType="MyNamespace.Models.Country"/>
<EntitySet Name="Provinces" EntityType="MyNamespace.Models.Province"/>
<AssociationSet Name="MyNamespace_Models_Country_Provinces_MyNamespace_Models_Province_ProvincesPartnerSet" Association="MyNamespace.Models.MyNamespace_Models_Country_Provinces_MyNamespace_Models_Province_ProvincesPartner">
<End Role="ProvincesPartner" EntitySet="Countries"/>
<End Role="Provinces" EntitySet="Provinces"/>
</AssociationSet>
<AssociationSet Name="MyNamespace_Models_Province_Country_MyNamespace_Models_Country_CountryPartnerSet" Association="MyNamespace.Models.MyNamespace_Models_Province_Country_MyNamespace_Models_Country_CountryPartner">
<End Role="CountryPartner" EntitySet="Provinces"/>
<End Role="Country" EntitySet="Countries"/>
</AssociationSet>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
有沒有人研究過擴展ODataConventionBuilder以支持這些約束?我真的希望堅持使用網絡API,並使用OData。 –
我們已經討論過一種方法,允許您手動「調整」breeze客戶端數據模型以允許這樣做,但我們實際上並未考慮修改ODataConventionModelBuilder。但這是一個有趣的方法。我們希望MS在我們之前到達那裏。 –