从webapi / angularjs

时间:2015-12-01 18:14:47

标签: angularjs json entity-framework asp.net-web-api navigation-properties

我正在使用angularjs,实体框架代码优先和webapi创建一个示例应用程序。绑定数据时遇到问题。我有一个HTML表格的视图,显示" court"实体。还有一个地区实体与法院的一对多关系(在#34;一个"一侧的区域)由我的模型中的导航属性表示。发生的事情是web api控制器正在返回所有数据,但是当它到达角度控制器时,大多数结果,而不是所有结果,最终都是" undefined"。

enter image description here

Web api控制器:

[HttpGet]
[Route("api/court/search/district/{DistrictId}/")]
public HttpResponseMessage GetCourtsByDistrict(string DistrictId)
{
    DistrictId = DistrictId == "0" ? null : DistrictId;
    HttpResponseMessage response = null;
    IEnumerable<Court> courts;

    courts = courtService.FindBy(d => d.DistrictId.Contains(DistrictId));
    response = Request.CreateResponse(HttpStatusCode.OK, courts);

    return response;
}

法院服务查找方法:

public IEnumerable<Court> FindBy(Expression<Func<Court, bool>> predicate)
{
    IEnumerable<Court> query = CourtRepository.FindBy(predicate);
    return query;
}

Angular工厂:

factory.getCourtsByDistrict = function (districtId) {
    url = baseAddress + "court/search/district/" + districtId;
    return $http.get(url);
};

角度控制器:

$scope.getCourtsByDistrict = function (DistrictID) {
    courtFactory.getCourtsByDistrict(DistrictID)
        .success(function (data) {
            $scope.courts = data;
        })
        .error(function (error) {
            alertService.add('danger', 'Unable to load district data: ' + JSON.stringify(error));
        });
};

型号:     公共部门法院     {         公共法院()         {             Employees = new HashSet();         }

    [Key]
    public string CourtId { get; set; }
    public string CourtName { get; set; }
    public string DistrictId { get; set; }
    public virtual District District { get; set; }

    [ForeignKey("CourtId")]
    public ICollection<Employee> Employees { get; set; }
}

public partial class District
{
    public District()
    {
        Courts = new HashSet<Court>();
        Employees = new HashSet<Employee>();
    }

    [Key]
    public string DistrictId { get; set; }
    public string DistrictName { get; set; }

    [ForeignKey("DistrictId")]
    public virtual ICollection<Court> Courts { get; set; }

    [ForeignKey("DistrictId")]
    public ICollection<Employee> Employees { get; set; }
}

如果我从Court模型中删除以下行或删除虚拟属性:

public virtual District District { get; set; }

然后所有法院实体数据都正确返回。但是,我想从区域实体返回区域名称属性,对于视图表中的每个法院,所以我需要虚拟区域属性。我不确定发生了什么。还有一个雇员实体,与区和法院实体一对一。这几乎就像angularJS无法处理导航属性正在创建的关系的水平。

我进一步研究了fiddler的问题,如果你看下面的图片,你可以看到将(虚拟)导航属性添加到我的类中更改了web api控制器返回的JSON的结构,这似乎正在产生&#34; undefined&#34;项目:

enter image description here

1 个答案:

答案 0 :(得分:1)

好的,省略虚拟关键字会阻止EF将这些数据加载到您的集合中。在这种情况下,如果你真的想要加载数据,你必须告诉EF,或多或少这样:

var query = Db.District.Include(f => f.Courts) //this will populate the Courts collection for you in the case your property is not virtual 

检查斯科特的回答here

另外,也许您应该创建一个DTO以便按照您希望的方式将数据发送回客户端,这也是一个很好的做法,可以对要发送的数据进行建模,而不是发送对象的整个图形,这样就可以了像ViewModel。