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