我刚刚开始使用Breeze(使用Angular),并设法从我的Odata服务中获取一些数据并将其显示在页面上。但是,我现在需要通过外键获取相关字段(我需要将Group与Team对象相关)并且我遇到了一些困难。在版本1.0.3之后使用datajs会导致问题,因此我使用的是版本1.0.3,但此版本不允许使用“expand”。所以我在我的模型中禁用了延迟加载,并在进入我的控制器时使用了Include:
public partial class Team
{
public int TeamId { get; set; }
public string TeamName { get; set; }
public string FlagSmall { get; set; }
public string FlagLarge { get; set; }
public string BadgeSmall { get; set; }
public string BadgeLarge { get; set; }
public string TeamImage { get; set; }
//foreign key
public int GroupId { get; set; }
//navigation properties
public Group Group { get; set; } //virtual removed to disable lazy loading
}
// GET odata/Teams
[Queryable]
public IQueryable<Team> GetTeams()
{
return db.Teams.Include("Groups"); //get navigation property
}
// GET odata/Teams(5)
[Queryable]
public SingleResult<Team> GetTeam([FromODataUri] int key)
{
return SingleResult.Create(db.Teams.Include("Groups").Where(team => team.TeamId == key));
}
然而,这也不起作用,它给出了由&gt;引起的错误的类似错误。 datajs 1.0.3:
[Q] Unhandled rejection reasons (should be empty): ["createError@http://bras...s/datajs-1.0.3.js:1055\n"]
有没有人解决这个问题并设法通过外键获取相关字段?
编辑:
这是我的角度代码,我尝试引用team.Group.GroupName,team.GroupName和group.GroupName,但这些都不起作用:
<tbody>
<tr ng-repeat="team in teams | filter:search:TeamName | orderBy:'TeamId'" id="team_{{team.id}}">
<td>{{team.TeamId}}</td>
<td>{{team.TeamName}}</td>
<td><img src={{team.FlagSmall}}></img></td>
<td><img style="width:40px;height:40px" src={{team.FlagLarge}}></img></td>
<td><img style="width:40px;height:40px" src={{team.BadgeSmall}}></img></td>
<td><img style="width:40px;height:40px" src={{team.BadgeLarge}}></img></td>
<td><img style="width:80px;height:40px" src={{team.TeamImage}}></img></td>
<td>{{team.Group.GroupName}}</td>
</tr>
</tbody>
编辑2:
这是我的Breeze查询:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams")).to$q();
};
编辑3:
经过一些实验,我设法使用以下Breeze查询:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams").
select("TeamId, TeamName, FlagSmall, FlagLarge, BadgeSmall, BadgeLarge, TeamImage, " +
"Group.GroupName").expand("Group")).to$q();
};
不确定这是否是正确的方法,或者即使它应该工作......是不是应该扩展不应该与Angular一起使用?
编辑4:
这是最终的工作查询,不需要上面的选择:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams").
expand("Group")).to$q();
};
答案 0 :(得分:0)
尝试添加:
[ForeignKey("GroupId")]
[InverseProperty("Teams")]
public Group Group { get; set; }
编辑:
再次检查之后,我注意到这种关系与我初看起来的想法不同。由于一个组有多个团队,请尝试以另一种方式查询:
[Queryable]
public IQueryable<Group> GetGroupsWithTeams()
{
return db.Groups.Include("Teams"); //get navigation property
}
这应该正确地返回所有内容。
答案 1 :(得分:0)
我刚尝试过,它对我没有任何问题。
我在问题中复制的代码段中看到了拼写错误。 Item类中定义的导航属性的名称是Group,但是您将“Groups”传递给Include函数。您是否可以通过修复拼写错误来尝试,如果仍然遇到问题则更新?
更新: 看来如果不使用expand就无法获取导航属性。因为即使没有展开的OData URL也不会发送导航属性的值,尽管在LINQ查询中使用了Include。