Asp.net web api 微风1.4.6+;Web API 2 OData-缺少导航属性

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;}

我试图在撰写本文时使用最新版本的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;}
公共长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。但这是一个有趣的方法。我们希望微软能在我们之前到达那里。