【问题标题】:Breeze working with Web API ODataBreeze 使用 Web API OData
【发布时间】:2013-08-24 03:54:48
【问题描述】:

我有一个 .NET WebAPI 2 Odata 服务,我正在使用 Breeze 在它之上 OData服务基于VS2013 ASP.Net VNext版本 服务支持 展开 我设法欺骗 Microsoft OData 元数据序列化以提供具有外键的引用约束,如下所示:

<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="ODataGame.Models">
<EntityType Name="Incident">
<Key>
<PropertyRef Name="ID"/>
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false"/>
<Property Name="Name" Type="Edm.String"/>
<Property Name="Desc" Type="Edm.String"/>
<NavigationProperty Name="DTask" Relationship="ODataGame.Models.ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTask" ToRole="DTask" FromRole="Incident"/>
</EntityType>
<EntityType Name="DTask">
<Key>
<PropertyRef Name="ID"/>
</Key>
<Property Name="ID" Type="Edm.Int32" Nullable="false"/>
<Property Name="Name" Type="Edm.String"/>
<Property Name="IncidentID" Type="Edm.Int32" Nullable="false"/>
<NavigationProperty Name="Incident" Relationship="ODataGame.Models.ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTask" ToRole="Incident" FromRole="DTask"/>
</EntityType>
<Association Name="ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTask">
<End Type="ODataGame.Models.Incident" Role="Incident" Multiplicity="0..1"/>
<End Type="ODataGame.Models.DTask" Role="DTask" Multiplicity="*"/>
<ReferentialConstraint>
<Principal Role="Incident">
<PropertyRef Name="ID"/>
</Principal>
<Dependent Role="DTask">
<PropertyRef Name="IncidentID"/>
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="ODataGame_Models_DTask_Incident_ODataGame_Models_Incident_IncidentPartner">
<End Type="ODataGame.Models.Incident" Role="Incident" Multiplicity="0..1"/>
<End Type="ODataGame.Models.DTask" Role="DTask" Multiplicity="0..1"/>
</Association>
<EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="Incident" EntityType="ODataGame.Models.Incident"/>
<EntitySet Name="DTask" EntityType="ODataGame.Models.DTask"/>
<AssociationSet Name="ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTaskSet" Association="ODataGame.Models.ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTask">
<End Role="Incident" EntitySet="Incident"/>
<End Role="DTask" EntitySet="DTask"/>
</AssociationSet>
<AssociationSet Name="ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTaskSet" Association="ODataGame.Models.ODataGame_Models_DTask_DTaskPartner_ODataGame_Models_Incident_DTask">
<End Role="DTask" EntitySet="DTask"/>
<End Role="Incident" EntitySet="Incident"/>
</AssociationSet>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

问题是 Web API odata 在一个额外的结果元素中返回扩展结果,而不是像这样直接作为 jason 数组:

     "__metadata":{
              "id":"http://localhost:27698/odata/Incident(3)","uri":"http://localhost:27698/odata/Incident(3)","type":"ODataGame.Models.Incident"
            },"DTask":{
              "results":[
                {
                  "__metadata":{
                    "id":"http://localhost:27698/odata/DTask(1)","uri":"http://localhost:27698/odata/DTask(1)","type":"ODataGame.Models.DTask"
                  },"Incident":{
                    "__deferred":{
                      "uri":"http://localhost:27698/odata/DTask(MEIR%20MISSING)/Incident"
                    }
                  },"ID":1,"Name":"kk","IncidentID":3
                }
              ]
            },"ID":3,"Name":"asas","Desc":"zz"
          }

有没有办法配置微风来正确处理?

如果我仅在一个元素中具有导航属性而另一侧没有反向属性,例如在我的情况下,事件包含任务集合但任务不需要引用事件,Breeze 不需要似乎支持正确,有没有办法配置它?

【问题讨论】:

  • 您是否解决了有关微风未处理的额外结果元素的问题?我在这里遇到同样的问题:stackoverflow.com/questions/19060244/…
  • 您能分享一下您是如何欺骗 OData EDM 序列化程序以包含引用约束的吗?由于缺少约束,我很难识别 1 到 m 的关联。

标签: odata breeze asp.net-web-api


【解决方案1】:

我对 Breeze OData 适配器不太熟悉,当您提到“ASP.Net VNext 版本”时,您在这里谈论的是不稳定、未发布的技术。您正处于最前沿。

如果您喜欢那里,欢迎您深入了解 Breeze OData“dataserviceAdapter”(未记录但in GitHub)和“jsonResultsAdapter”。使用后者,您应该能够将服务器发送给您的任何内容转换为客户端上有用的东西(如果您不能,我想知道它)。

【讨论】:

  • 我能够更改微风以正确处理结果属性,第二个问题是更通用的微风,微风是否处理您仅在其中一个实体中具有导航属性但没有导航属性的用例其他,例如,如果我有一个任务集合并发生事件,我希望事件有一个任务数组,但我不想在任务上拥有事件的属性。
  • 是的,您可以在关联的一侧拥有导航属性,但不能在另一侧拥有导航属性。
【解决方案2】:

从现在可用的 1.4.4 版开始,Breeze 支持 OData v3。这可能是您遇到的问题。

以前仅支持 OData v2。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-02-06
    • 2011-10-08
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多