2013-08-21 5 views
1

У меня есть .NET WebAPI 2 службы OData и я работаю с Breeze на нем Служба OData основана на версии VS2013 ASP.Net VNext Сервис поддерживает расширение мне удалось обмануть Serialize метаданных Microsoft OData обеспечить ограничение ссылочного с внешним ключом следующим образом:Breeze работы с Web API 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> 

Проблемой заключается в том, что возвращает веб-API OData расширить результат в течение дополнительного конечного элемента, а не непосредственно в виде массива Джейсона как так:

 "__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 does кажется, не поддерживает это правильно, есть ли способ настроить это?

+0

Вы решили эту проблему относительно дополнительного элемента результата, который не обрабатывается бризом? У меня такая же проблема: http://stackoverflow.com/questions/19060244/breezejs-navigation-property-is-created-but-not-filled-with-data – Sam

+0

Не могли бы вы поделиться тем, как вы обманули OData EDM сериализатор для включения ссылки ReferentialConstraint? У меня возникли проблемы с тем, чтобы получить легкий веток, чтобы распознать связь 1-м-м из-за недостающего ограничения. – khaledh

ответ

0

Я не знаком с адаптером Breeze OData, и вы говорите о нестабильных, невыпущенных технологиях здесь, когда ссылаетесь на «версию ASP.Net VNext». Вы работаете над кровотечением.

Если вам это нравится, вы можете погрузиться в Breeze OData «dataserviceAdapter» (не задокументировано, но in GitHub) и «jsonResultsAdapter». С последним вы сможете сгибать все, что сервер посылает вам на что-то полезное на клиенте (если вы не можете, я хочу знать об этом).

+0

Я могу изменить ветер, чтобы обработать свойство результатов правильно, второй вопрос - более общий бриз, ведите ли вы ведение дела, когда у вас есть свойство навигации только в одном из объектов, но не в другом, например, если у меня есть и инцидент с набором задач, я хочу, чтобы инцидент имел массив задач, но я не хочу иметь свойство для инцидента в задаче. –

+0

Да, вы можете иметь свойство навигации с одной стороны ассоциации, но не другое. – Ward

0

Начиная с версии 1.4.4, доступной сейчас, Breeze поддерживает OData v3. Вероятно, это была проблема, с которой вы столкнулись.

Ранее поддерживалась только OData v2.