Breeze扩展属性-如何在控制器阵列中引用

Breeze expanded properties - how to reference in controller arrays

本文关键字:控制器 阵列 引用 扩展 属性 Breeze      更新时间:2023-09-26

在我第一次尝试为带有Breeze和EF6(Hot毛巾/John Papa风味)的实体绘制完整实体图时,我缺少了一个关键的理解

我有Policies-p_Locations-p_Hazards的亲子关系

我想查看一个客户端的所有策略的图表

简而言之,我的查询返回了我期望的JSON形状(在XHR查看器中确认)和数据。结果允许我向下搜索(通过backingstore-man,我们需要像C#这样的javascript查看器吗),以查看子代和孙代的数组。我看到了我期望的客户端的所有策略、位置和危险(帖子末尾的dll版本和模型/模型图代码)

数据上下文:

    function getPoliciesByClientsId(clientsid) {
        var policies;
        return EntityQuery.from('Policies')
            .withParameters({ clientsid: clientsid })
            .expand('P_Locations, P_Locations.P_Hazards')
            .using(manager).execute()
            .then(querySucceeded, _queryFailed);
        function querySucceeded(data) {
            policies = data.results;
            log('Retrieved [Policy] from remote data source', policies.length, true);
            return policies;
        }
    }

控制器:

function getPoliciesByClientsId(clientsid) {
    return datacontext.getPoliciesByClientsId(clientsid).then(function(data) {
        vm.Policies = [];
        vm.Policies = data;
// at this point vm.Policies shows an object array 
// and I can see p_Locations for each policy and p_Hazards for each location
// but vm.Policies.p_locations is undefined
            return vm.Policies;
        }
    );

}

如果我深入研究datacontext或vm中的策略。控制器中的策略我看到了骆驼大小写的数组。

但是

vm.Policies.p.Locations未定义当然我想引用vm。警察.p_Locations.p_Hazards。

为了引用数据图进行绑定,我缺少了什么

微风控制器:

[HttpGet]
public IQueryable<Policy> Policies()
{
    return _repository.Policies;
}

PwiDepository

    public IQueryable<Policy> Policies
    {
        get { return Context.Policies; }
    }

这就创建了请求

Request URL:http://localhost:29130/breeze/Breeze/Policies?$expand=P_Locations%2CP_Locations%2FP_Hazards&clients_id=439

使用manager.metadataStore.getEntityType('p_Location'),然后钻取导航属性我找到了这些

navigationProperties: Array[4]0: 
dassociationName: "P_Hazard_P_Location"
entityType: l
entityTypeName: "P_Hazard:#Pwi.Model.Models"
foreignKeyNames: Array[0]
foreignKeyNamesOnServer: Array[0]
invForeignKeyNames: Array[1]
invForeignKeyNamesOnServer: Array[1]
inverse: disScalar: falsename: "p_Hazards"
nameOnServer: "P_Hazards"
parentType: lvalidators: Array[0]
associationName: "P_Location_Policy"
entityType: lentityTypeName: "Policy:#Pwi.Model.Models"
foreignKeyNames: Array[1]
foreignKeyNamesOnServer: Array[1]
invForeignKeyNames: Array[0]
invForeignKeyNamesOnServer: Array[0]
inverse: disScalar: truename: "policy"
nameOnServer: "Policy"parentType: l
relatedDataProperties: Array[1]validators: Array[0]__proto__: Objectlength: 4

这是dll件

<packages>
  <package id="Breeze.Server.ContextProvider" version="1.4.17" targetFramework="net45" />
  <package id="Breeze.Server.ContextProvider.EF6" version="1.4.17" targetFramework="net45" />
  <package id="Breeze.Server.WebApi2" version="1.4.17" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.OData" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.0" targetFramework="net45" />
  <package id="Microsoft.Data.Edm" version="5.6.2" targetFramework="net45" />
  <package id="Microsoft.Data.OData" version="5.6.2" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="6.0.4.0" targetFramework="net45" />
  <package id="System.Spatial" version="5.6.2" targetFramework="net45" />
  <package id="WebActivator" version="1.5.3" targetFramework="net45" />
</packages>

我有一个警察-p_Locations-p_Hazards的亲子关系以下是模型和模型映射的相关部分

位置模型(_L):

public partial class P_Location
    {
        public P_Location()   
        {
            this.P_GlCoverages = new List<P_GlCoverage>();
            this.P_Hazards = new List<P_Hazard>();
            this.P_PropertyCoverages = new List<P_PropertyCoverage>();
        }
        public int P_Locations_id { get; set; }
        public int Policies_id { get; set; }
      ......
      public virtual Policy Policy { get; set; }
      public virtual ICollection<P_Hazard> P_Hazards { get; set; }

p_LocationMap

 // Relationships
            this.HasRequired(t => t.Policy)
                .WithMany(t => t.P_Locations)
                .HasForeignKey(d => d.Policies_id);

p_危害模型

public Policy Policy { get; set; }
        public P_Location P_Location { get; set; }

危险地图

  // Relationships
            this.HasRequired(t => t.P_Location)
                .WithMany(t => t.P_Hazards)
                .HasForeignKey(d => d.P_Locations_id);

首先,我要检查以确保查询返回的对象实际上是实体。即,它们是否都有一个"entityspect"属性?如果没有,则返回的是投影而不是实体。发生这种情况的原因多种多样,但通常是由于namingConvention问题或EntityQuery上缺少"toType"调用。(如果查询端点不在实体类型/资源名称映射中(参数化查询通常是这种情况),则需要)。

我还会使用getEntityType查看MetadataStore,并确保每个实体的属性名称符合您的期望。

你也可以发布服务器端的查询吗?