0

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

然而,在微风中,我只得到每个依赖对象中的第一个对象。例如,我有一个带有两个“车辆”对象的“策略”对象。我只看到一辆车(即使我在 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; }
}
4

2 回答 2

1

现在我看到了你的模型,我想我看到了这个问题。

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

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

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

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

2) 使用服务器端Include子句

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

更多信息:导航属性

我希望这足够清楚。

于 2013-07-23T20:02:36.600 回答
0

抱歉,如果没有看到“策略”及其元数据的底层实现,很难知道发生了什么。但我可以提出一般性建议。

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

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

在此示例中,假设 Breeze 具有 Customer 和 Order 类型的元数据,Breeze 将解构结果并将 Customer 及其订单添加到 EntityManager,并返回一个 json 对象集合,每个对象都具有“Customer”和 Orders 属性。客户和个人订单也将各自“适应”到当前模型库(即淘汰、主干或 backingStore - 用于 Angular)。

于 2013-07-23T17:48:15.233 回答