当我检索完整的对象图时,只能看到一个孩子可观察到

时间:2013-07-23 15:49:06

标签: breeze

我有一个大型对象图,我想返回到客户端(整个模型的概述)所以我决定将它作为一个大对象发回(我将它作为有问题的对象返回。)< / p>

然而,在Breeze中,我只获得每个依赖对象中的第一个对象。例如,我有一个带有两个“车辆”对象的“政策”对象。我只看到一辆车(即使我在var p = data.results [0]处设置断点。从通话中回来的json显示两辆车但是微风只能抓到一辆。

我能做些什么来获得其他的?这是我正在做的电话:

var getPolicyByPolicyNumber = function (lob, policynumber, policyObservable) {

    var params = {};
    params['lOBCd'] = lob;
    params['policyNumber'] = policynumber;

    var query = EntityQuery.from('PolicyInquiry')
        .withParameters(params);


    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {
        var p = data.results[0];
        p.completeTree(true);

        return policyObservable(p);

    }

};

在我的微风控制器中,我有以下内容:

[System.Web.Http.HttpGet]
public Policy PolicyInquiry(string lOBCd, string policyNumber)
{
    UserProfile userProfile = _contextProvider.Context.UserProfiles.SingleOrDefault(u => u.UserName == WebSecurity.CurrentUserName);
    var policy = Uow.PolicyServices.GetPolicy(userProfile.BrokerId, userProfile.AgencyId, "csio:" + lOBCd, policyNumber);
    return policy;
}

这是一个显示政策和工具的缩略模型:

public class Policy
{
    public int Id { get; set; }
    public string PolicyNumber { get; set; }

    [InverseProperty("Policy")]
    public ICollection<Vehicle> Vehicles { get; set; }

    // other fields removed
}

public class Vehicle
{
    public int Id {get; set}
    public string ItemId { get; set; }
    // other fields removed

    //Foreign Keys
    public int PolicyId { get; set; }
    [IgnoreDataMember]
    [ForeignKey("PolicyId")]
    [Required]
    public virtual Policy Policy { get; set; }
}

2 个答案:

答案 0 :(得分:1)

现在我看到你的模特我觉得我看到了这个问题。

Breeze不会自动解析查询中的实体图。即,如果您检索策略,Breeze仅返回Policy实例本身,而不解析任何导航属性。这是设计使,因此单个查询不会降低整个实体图。

如果您想要任何导航属性的值,您有三个选项,其中第三个可能是您最好的选择。为了解释的目的,我在简化模型方面采取了一些自由。这些都假设“Policy”类型实际上被定义为Breeze实体类型,即在Breeze metadataStore中具有元数据定义。

1)使用客户端 EntityQuery.expand 子句

  var query = EntityQuery.from('Policy')
    .expand("Vehicles")
    .withParameters(params);

2)使用服务器端包含子句

[System.Web.Http.HttpGet]
public IEnumberable<Policy>(string lOBCd, string policyNumber) {
    return _contextProvider.Context.Policies.Where(....).Include("Vehicles");
}

3)使用包含两个已知实体类型的匿名结果。

[System.Web.Http.HttpGet]
 public Object PolicyInquiry(string lOBCd, string policyNumber) {
    UserProfile userProfile = _contextProvider.Context.UserProfiles.SingleOrDefault(u =>    u.UserName == WebSecurity.CurrentUserName);
    var policy = Uow.PolicyServices.GetPolicy(userProfile.BrokerId, userProfile.AgencyId, "csio:" + lOBCd, policyNumber);
    return new { 
       Policy = policy, 
       Vehicles = policy.GetVehicles() // insure that they are actually resolved on the server)
    }
    return policy;
}

此处有更多信息:Navigation Properties

我希望这很清楚。

答案 1 :(得分:0)

很抱歉,但是没有看到“政策”及其元数据的基础实施,很难说出发生了什么。但我可以提出一般性建议。

1)如果你想返回一个聚合对象并让Breeze识别它的组成部分,推荐的机制是创建一个投影并返回它。即

之类的东西
public IQueryable<Object> CompanyInfoAndOrders() {
   return ContextProvider.Context.Customers.Select(c => new { Customer = c, Orders = c.Orders });
}

在此示例中,提供Breeze具有客户和订单类型的元数据, Breeze将解构结果并将Customer及其订单添加到EntityManager,并返回一组json对象,每个对象都带有“Customer”和Orders属性。客户和个别订单都将“适应”当前的模型库(即,针对Angular的淘汰赛,骨干或后端商店)。