微风导航属性

时间:2014-01-01 13:25:46

标签: javascript angularjs asp.net-web-api odata breeze

我刚刚开始使用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();
};

2 个答案:

答案 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。