Asp.net web api 微风1.4.6+;Web API 2 OData-缺少导航属性
我试图在撰写本文时使用最新版本的Breeze(1.4.6)和WebAPI2(ODataController)。我的问题是,Breeze的结果缺少导航属性 考虑以下几点:Asp.net web api 微风1.4.6+;Web API 2 OData-缺少导航属性,asp.net-web-api,odata,breeze,Asp.net Web Api,Odata,Breeze,我试图在撰写本文时使用最新版本的Breeze(1.4.6)和WebAPI2(ODataController)。我的问题是,Breeze的结果缺少导航属性 考虑以下几点: 公共类国家/地区:EntityBase { 公共国家() { 省份=新名单(); } [必需] [StringLength(256)] 公共字符串名称{get;set;} [必需] [第(3)款] 公共字符串缩写{get;set;} //导航属性 [反向财产(“国家”)] 公共虚拟ICollection区域{get;set;}
公共类国家/地区:EntityBase
{
公共国家()
{
省份=新名单();
}
[必需]
[StringLength(256)]
公共字符串名称{get;set;}
[必需]
[第(3)款]
公共字符串缩写{get;set;}
//导航属性
[反向财产(“国家”)]
公共虚拟ICollection区域{get;set;}
}
公共类省:EntityBase
{
[必需]
[StringLength(256)]
公共字符串名称{get;set;}
[必需]
[第(3)款]
公共字符串缩写{get;set;}
公共长CountryId{get;set;}
[外国钥匙(“CountryId”)]
[反向财产(“省”)]
公共虚拟国家{get;set;}
}
然后,我使用VS 2013为国家/地区搭建了一个ODataController,并确保我的WebApiConfig已正确更新:
var builder=new ODataConventionModelBuilder();
建筑商实体集(“国家”);
建筑商实体集(“省”);
builder.Namespace=“MyNamespace.Models”;
var batchHandler=新的DefaultODataBatchHandler(GlobalConfiguration.DefaultServer);
config.Routes.MapODataRoute(“odata”,“odata”,builder.GetEdmModel(),batchHandler);
此时,我能够成功地对数据运行查询
?$expand=省
这将返回您期望的结果:
{
"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,并将Breeze配置为使用OData。下面是我用来配置和创建breeze manager的内容:
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>
这里的问题是,Microsoft的ODataConventionModelBuilder目前没有为EDMX支持的模型公开OData约束。他们知道这一点,并声称他们计划在以后的版本中这样做 同时,你有两个选择 1) 忽略ODataConventionBuilder,使用默认的Breeze WebApi2实现直接与封装EFModel的BreezeController实例对话。这实际上支持ODataConventionModelBuilder将提供的超集,而不需要任何额外的复杂性。查看微风拉链中的任何微风示例。(尤其是DocCode示例) 2) 使用WCF数据服务将EF模型公开为OData服务。WCF数据服务确实公开OData约束
我们计划在“近期”的某个时候提供关于您在这些领域的选择的附加文档。所以请继续关注 这里的问题是,Microsoft的ODataConventionModelBuilder目前没有为EDMX支持的模型公开OData约束。他们知道这一点,并声称他们计划在以后的版本中这样做 同时,你有两个选择 1) 忽略ODataConventionBuilder,使用默认的Breeze WebApi2实现直接与封装EFModel的BreezeController实例对话。这实际上支持ODataConventionModelBuilder将提供的超集,而不需要任何额外的复杂性。查看微风拉链中的任何微风示例。(尤其是DocCode示例) 2) 使用WCF数据服务将EF模型公开为OData服务。WCF数据服务确实公开OData约束
我们计划在“近期”的某个时候提供关于您在这些领域的选择的附加文档。所以请继续关注 有人考虑过扩展ODataConventionBuilder以支持这些约束吗?我真的希望坚持使用web api并使用OData。我们已经讨论了一种方法,允许您手动“调整”breeze客户端数据模型以实现这一点,但实际上我们还没有考虑修改ODataConventionModelBuilder。但这是一个有趣的方法。我们希望微软能在我们之前到达那里。有人考虑过扩展ODataConventionBuilder来支持这些约束吗?我真的希望坚持使用web api并使用OData。我们已经讨论了一种方法,允许您手动“调整”breeze客户端数据模型以实现这一点,但实际上我们还没有考虑修改ODataConventionModelBuilder。但这是一个有趣的方法。我们希望微软能在我们之前到达那里。