2013-07-23 56 views
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; } 
} 

回答

1

現在,我看到你的模型,我想我看到了這個問題。

Breeze不會自動解析查詢中的實體圖形。即如果您檢索策略,則Breeze僅返回策略實例本身,而不解決任何導航屬性。這是設計完成的,所以單個查詢不會導致整個實體圖形失效。

如果你想要任何導航屬性的值你有三個選項,其中第三個選項可能是你最好的選擇。爲了解釋的目的,我簡化了你的模型。這些都假設「策略」類型實際上定義爲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

我希望這是非常明顯的。

0

對不起,但沒有看到「策略」及其元數據的底層實現,很難說出發生了什麼。但我可以提出一個普遍的建議。 1)如果你想返回一個聚合對象並讓微風識別它是組成部分,推薦的機制是創建一個投影並返回它。即像

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

在這個例子中,提供微風有元數據的客戶和訂單類型, 微風將解構的結果,並添加客戶和訂單EntityManager的,並返回集合json對象都帶有「Customer」和Orders屬性。客戶和個人訂單都將被「改編」到當前的模型庫(即淘汰,骨幹或支持商店 - 適用於Angular)。

+0

你在說模型嗎? – Maleki

相關問題