我有一个大型对象图,我想返回到客户端(整个模型的概述)所以我决定将它作为一个大对象发回(我将它作为有问题的对象返回。)< / 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; }
}
答案 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的淘汰赛,骨干或后端商店)。