0

我使用angularjs,实体框架代码优先和webapi创建示例应用程序。绑定数据时遇到问题。我有一个HTML表格来显示“法院”实体列表。还有一个地区实体与我的模型中的导航属性所代表的法院(“一方”区域)具有一对多关系。现在发生的事情是web api控制器正在返回所有的数据,但是到了角度控制器时,大部分结果(不是全部)最终都会显示为“未定义”。从webapi/angularjs影响json结果的类虚拟导航属性

enter image description here

网络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; 
} 

角工厂:

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)); 
     }); 
}; 

型号: 公共部分类法院 { 公共法院() { 雇员=新的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; } 
} 

如果我删除从法院模型下面的行或删除虚拟财产:

public virtual District District { get; set; } 

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

我对小提琴手的问题进行了深入研究,如果你看下面的图像,你可以看到添加(虚拟)导航属性到我的类改变了web api控制器返回的JSON的结构,这似乎是生产“未定义”项目:

enter image description here

回答

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一样工作。

+0

谢谢布鲁诺。我想过做一个视图模型。我现在用我所有的MVC应用程序来做到这一点。这将需要我重新调整我的应用程序,但如果是这样的话,那就这样吧。我还会研究.Include声明。谢谢。 – steveareeno

+0

有一个“简单”的方法来做到这一点,你知道AutoMapper,它很容易实现:[看看这里](https://github.com/AutoMapper/AutoMapper/wiki/Getting-started) –

+0

我已经使用Omu.ValueInjecter将我的模型注入到视图模型中。我也会看看automapper。谢谢。 – steveareeno