我使用angularjs,实体框架代码优先和webapi创建示例应用程序。绑定数据时遇到问题。我有一个HTML表格来显示“法院”实体列表。还有一个地区实体与我的模型中的导航属性所代表的法院(“一方”区域)具有一对多关系。现在发生的事情是web api控制器正在返回所有的数据,但是到了角度控制器时,大部分结果(不是全部)最终都会显示为“未定义”。从webapi/angularjs影响json结果的类虚拟导航属性
网络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的结构,这似乎是生产“未定义”项目:
谢谢布鲁诺。我想过做一个视图模型。我现在用我所有的MVC应用程序来做到这一点。这将需要我重新调整我的应用程序,但如果是这样的话,那就这样吧。我还会研究.Include声明。谢谢。 – steveareeno
有一个“简单”的方法来做到这一点,你知道AutoMapper,它很容易实现:[看看这里](https://github.com/AutoMapper/AutoMapper/wiki/Getting-started) –
我已经使用Omu.ValueInjecter将我的模型注入到视图模型中。我也会看看automapper。谢谢。 – steveareeno