2014-07-09 35 views
0

我從Breeze WebApi返回的JSON結果沒有正確地分配給挖空observable當圖的根中的實體先前存在爲子實體。帶有擴展子實體的微風entityquery沒有正確地分配給knockout可觀察數組

我有一個具有1個或多個租戶實體用戶和租戶可以有一個或多個用戶(多對多的關係)

當運行一個查詢我得到以下JSON結果(我只秀相關部分):

{ "$id": "1", 
    "$type": "Imp.Tenant, Imp", 
    "TenantId": "14ff1ad0-6807-e411-befb-2c41384f9e84", 
    "Users": [{ 
      "$id": "2", 
      "$type": "Imp.User, Imp", 
      "UserId": "d38a68c2-4407-e411-befb-2c41384f9e84", 
      "Firstname": "Richard", 
      "Tenants": [{ 
        "$ref": "1" 
       },{ 
        "$id": "3", 
        "$type": "Imp.Tenant, Imp", 
        "TenantId": "5c8d8852-6907-e411-befb-2c41384f9e84", 
        "Users": [{ 
          "$ref": "2" 
         } 
        ], 
       } 
      ], 
      "CurrentTenant": { 
       "$ref": "1" 
      }, 
      "CurrentTenantId": "14ff1ad0-6807-e411-befb-2c41384f9e84", 
     } 
    ], 
    "CreatedBy": { 
     "$ref": "2" 
    }, 
    "CreatedById": "d38a68c2-4407-e411-befb-2c41384f9e84" 
},{ 
    "$ref": "3" 
} 

我運行以下查詢(打字稿代碼):

var query = breeze.EntityQuery 
      .from("userTenants") 
      .withParameters({ userId: userId }); 

return query 
      .using(this.BreezeEntityManager) 
      .execute() 
      .then((data) => this.Tenants(<Imp.Tenant[]>data.results)) 

,微風控制器看起來是這樣的:

public IQueryable<Tenant> userTenants(Guid userId) 
    {     
     var User = _ContextProvider.Context.Users 
      .Include("Tenants") 
      .FirstOrDefault(x => x.UserId == userId); 
     return User.Tenants.AsQueryable(); 
    } 

似乎因爲實體$ REF 1(ID 「14ff1ad0-6807-E411-befb-2c41384f9e84」)也是從用戶子實體它得到在JSON的端部稱爲$ REF 3串。

當試圖分配該值的knockoutObservableArray,只有第一個租戶實體正確分配,但第二個($ REF 3)獲得一個功能在監視窗口中顯示:

function(){ 
    return mc.refMap[nodeRefId]; 
} 

哪有我檢索用戶鏈接到的所有租戶?

+0

對不起,我不能repro你的問題。您可以創建一個簡單的repro解決方案並將其發送到[email protected]? –

+0

是租戶給用戶一個多對多的關係嗎? –

+0

@PW卡德是的,用戶的租戶是多對多的。 – RHAD

回答

1

對於它的價值,我想我只是解決了同樣的問題。根本原因似乎是,我的多對一導航屬性之一,使用EF的默認約定,沒有出現一個參考約束。導航屬性在客戶端被默默忽略。

在我的情況下,JSON編碼後來引用的對象(即通過$ ref)第一次出現在這個被忽略的屬性中,所以沒有被添加到映射上下文中。儘管我可能沒有在導航屬性的上下文中關心該對象,但我確實將它作爲原始查詢結果中出現的根級對象。

解決方法是映射基礎外鍵約束。

相關問題