具有扩展子实体的Breeze实体查询未正确分配给knockout observable数组

时间:2014-07-09 17:57:50

标签: entity-framework knockout.js asp.net-web-api breeze

我从Jreeze WebApi返回的JSON结果在图形根目录中的实体以前作为子实体存在时,未正确分配给knockout observable。

我有一个实体用户有一个或多个租户,一个租户可以有一个或多个用户(多对多关系)

运行查询时,我得到以下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"
}

我运行以下查询(Typescript代码):

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

如何检索用户所链接的所有租户?

1 个答案:

答案 0 :(得分:1)

对于它的价值,我想我只是解决了同样的问题。根本原因似乎是我的多对一导航属性之一,使用EF的默认约定,并没有表现出参照约束。导航属性在客户端被忽略。

在我的例子中,JSON编码稍后引用的第一个对象(即,通过$ ref)出现在这个被忽略的属性中,所以没有被添加到映射上下文中。虽然我可能在导航属性的上下文中没有关心该对象,但我确实将其视为出现在原始查询结果中的根级对象。

解决方法是映射底层外键约束。