我从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];
}
如何检索用户所链接的所有租户?
答案 0 :(得分:1)
对于它的价值,我想我只是解决了同样的问题。根本原因似乎是我的多对一导航属性之一,使用EF的默认约定,并没有表现出参照约束。导航属性在客户端被忽略。
在我的例子中,JSON编码稍后引用的第一个对象(即,通过$ ref)出现在这个被忽略的属性中,所以没有被添加到映射上下文中。虽然我可能在导航属性的上下文中没有关心该对象,但我确实将其视为出现在原始查询结果中的根级对象。
解决方法是映射底层外键约束。