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