class 影响 json 的虚拟导航属性来自 webapi/angularjs
class virtual navigation properties affecting json result from webapi/angularjs
我正在使用 angularjs、entity framework 代码优先和 webapi 创建示例应用程序。我 运行 在绑定数据时遇到了问题。我有一个带有 HTML table 的视图,其中显示了 "court" 个实体的列表。在我的模型中,还有一个地区实体与法院("one" 一侧的地区)具有一对多关系,由导航属性表示。发生的事情是网络 api 控制器正在 return 处理所有数据,但是当它到达 angular 控制器时,大部分结果(并非全部)最终为 "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);
};
Angular 控制器:
$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));
});
};
型号:
public部分class中庭
{
public 法院()
{
员工=新哈希集();
}
[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; }
则所有法院实体数据return正确。但是,对于视图 table 中的每个法院,我还想 return 来自地区实体的地区名称 属性,所以我有点需要虚拟地区 属性。我不确定发生了什么。还有一个雇员实体,它与地区和法院实体处于一对多的一侧。这几乎就像 angularJS 无法处理导航属性正在创建的关系级别。
我进一步研究了 fiddler 的问题,如果您查看下图,您可以看到将(虚拟)导航 属性 添加到我的 class 会更改 [=57] 的结构=] return 由网络 api 控制器编辑,它似乎正在生成 "undefined" 项:
好的,省略 virtual 关键字将阻止 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
查看 Scott 的回答 here
此外,也许您应该创建一个 DTO 以您想要的方式将数据发送回客户端,这也是对要发送的数据建模而不是发送对象的整个图形的好习惯,这将像 ViewModel 一样工作。
我正在使用 angularjs、entity framework 代码优先和 webapi 创建示例应用程序。我 运行 在绑定数据时遇到了问题。我有一个带有 HTML table 的视图,其中显示了 "court" 个实体的列表。在我的模型中,还有一个地区实体与法院("one" 一侧的地区)具有一对多关系,由导航属性表示。发生的事情是网络 api 控制器正在 return 处理所有数据,但是当它到达 angular 控制器时,大部分结果(并非全部)最终为 "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);
};
Angular 控制器:
$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));
});
};
型号: public部分class中庭 { public 法院() { 员工=新哈希集(); }
[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; }
则所有法院实体数据return正确。但是,对于视图 table 中的每个法院,我还想 return 来自地区实体的地区名称 属性,所以我有点需要虚拟地区 属性。我不确定发生了什么。还有一个雇员实体,它与地区和法院实体处于一对多的一侧。这几乎就像 angularJS 无法处理导航属性正在创建的关系级别。
我进一步研究了 fiddler 的问题,如果您查看下图,您可以看到将(虚拟)导航 属性 添加到我的 class 会更改 [=57] 的结构=] return 由网络 api 控制器编辑,它似乎正在生成 "undefined" 项:
好的,省略 virtual 关键字将阻止 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
查看 Scott 的回答 here
此外,也许您应该创建一个 DTO 以您想要的方式将数据发送回客户端,这也是对要发送的数据建模而不是发送对象的整个图形的好习惯,这将像 ViewModel 一样工作。