我已经配置了我的WebAPI ODATA服务(使用5.0.0-rc1进行$ expand和$ select支持),一切似乎都可以正常工作但导航属性。
元数据确实包含我的导航属性(Mandate上的OpenPositions):
然后我的微风查询如下:
function search() {
var query = breeze.EntityQuery.from("Mandates").expand("OpenPositions").inlineCount();
return manager.executeQuery(query.using(service)).then(function (result) {
logger.info(result);
}).fail(function (error) {
logger.error(error);
});
}
WebAPI控制器:
[Queryable(AllowedQueryOptions= AllowedQueryOptions.All)]
public override IQueryable<Mandate> Get()
{
return new List<Mandate>() { new Mandate() {
Id = 1,
PolicyNumber = "350000000",
OpenPositions = new List<OpenPosition>(){
new OpenPosition(){ Id = 1, Amount = 2300, Mandate_Id = 1 },
new OpenPosition(){ Id = 2, Amount = 2100, Mandate_Id = 1 }
}},
new Mandate() {
Id = 2,
PolicyNumber = "240000000" ,
OpenPositions = new List<OpenPosition>(){
new OpenPosition(){ Id = 3, Amount = 2500, Mandate_Id = 2 },
new OpenPosition(){ Id = 2, Amount = 2100, Mandate_Id = 2}
}
} }.AsQueryable<Mandate>();
}
没什么了不起的。但是虽然我的Mandate实体回到结果集中,但它们没有OpenPositions集合。
作为测试,如果我将.select("OpenPositions")
添加到我的微风查询中,那么我会收到错误:
unable to locate property: OpenPositions on entityType: Mandate:#WebAPINoBreeze.Models
为什么会这样?
[编辑] query.entityType.NavigationProperties是一个空数组,所以这可能是一个线索......似乎微风无法从元数据中构建navigationproperties。
[编辑]
外键补充道。问题仍然存在:
public class Mandate
{
public int Id { get; set; }
public string PolicyNumber { get; set; }
public EStatus Status { get; set; }
public virtual List<OpenPosition> OpenPositions { get; set; }
}
public class OpenPosition
{
public int Id { get; set; }
public decimal Amount { get; set; }
[ForeignKey("Mandate")]
public int Mandate_Id { get; set; }
}
** [编辑] **
由于某些原因,在编译时删除了[ForeignKey(“Mandate”)]属性(我认为这是因为生成了模型类。我找到了一种解决方法,现在元数据包含MandateId到MandateId的外键OpenPositions:
答案 0 :(得分:2)
您必须定义外键,因为Breeze关联需要FK。 http://www.breezejs.com/documentation/navigation-properties
<强> [编辑] 强>
您的双向关联应如下所示:
public class Mandate
{
public int Id { get; set; }
public string PolicyNumber { get; set; }
public virtual ICollection<OpenPosition> OpenPositions { get; set; }
}
public class OpenPosition {
public int Id { get; set; }
public decimal Amount { get; set; }
public int MandateId { get; set; }
public Mandate Mandate {get; set; }
}