Asp.net web api 带有Web API的实体框架5

Asp.net web api 带有Web API的实体框架5,asp.net-web-api,entity-framework-5,Asp.net Web Api,Entity Framework 5,我正在寻找使用EF database first方法和MVC4.5/web API构建web应用程序的最简单、最佳实践方法。我的应用程序将使用angular框架进行ajax调用,以便按需检索json数据 目前,为了响应api调用,我得到了过多且结构不良的数据,我想知道如何清理这些数据 该应用程序将提供工作跟踪,因此我有如下表格: Person Id Name Email Department : FK -> Department Department

我正在寻找使用EF database first方法和MVC4.5/web API构建web应用程序的最简单、最佳实践方法。我的应用程序将使用angular框架进行ajax调用,以便按需检索json数据

目前,为了响应api调用,我得到了过多且结构不良的数据,我想知道如何清理这些数据

该应用程序将提供工作跟踪,因此我有如下表格:

Person
    Id
    Name
    Email
    Department : FK -> Department

Department
    Id
    Name

Jobs
    Id
    RequestedBy : FK -> Person
    AssignedTo  : FK -> Person

JobHistory
    Id
    JobId : FK -> Jobs
所以,理想情况下,当我打电话时

$http.get(/api/People)
我会得到:

[{Name: 'alice', Email: 'alice@here.com', Department: 'ABC'},
 {Name: 'bob',   Email: 'bob@here.com',   Department: 'CDE'}]
我想这意味着通常会急切地加载主要实体,但不会加载所有其他依赖于Person的表。但有时我会想用这些反向引用来获取个人可能正在从事或要求的所有工作

如果可能的话,我不想求助于修改T4模板之类的事情。虽然这很聪明,但它不是很灵活。另外,我不喜欢给我一个电动工具的想法,并告诉我在使用之前必须研究示意图并重新布线内部。我不是一个专业的开发人员,我真的想专注于工作,而不是工具;Linq2Sql在这方面做得很好。当然,如果修改内脏是正确的答案,我会接受它

这似乎是对webapi的一种直接使用,我确信我遗漏了一些显而易见的东西

谢谢

编辑
最有可能导致部分问题的其他信息。在某种程度上,为了使上述功能发挥作用,我在Global.asax.cs中添加了以下内容:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;

通过即时加载,作业中引用Person的两个字段将生成循环引用。上面的代码允许Json.Net对其进行序列化,但会用不需要的数据填充Json。我相信解决方案是以某种方式切换到延迟加载,但这可以在数据库优先的方法中实现吗?

因此,奇怪的是,为了让延迟加载首先使用数据库,我必须在ConceptualEntityModel的属性中将“lazy loading Enabled”设置为false

我接着补充说

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore

在应用程序_Start()中,删除了问题中提到的PreserveReferencesHandling。这给了我希望从模型中获得的干净json

还有一个困难仍然存在,但如果没有更好的回应,我将努力解决它。在我的PersonRepository中,我使用:

public IEnumerable<Person> GetAll() {
return db.People
    .Include("C_Departments")
    .AsNoTracking();
}  
public IEnumerable GetAll(){
返回db.People
.包括(“C_部门”)
.AsNoTracking();
}  

让人们和他们的部门相处。不幸的是,如果Departments实体中有一个指向人员的导航属性,它会急切地加载部门的所有成员以及部门信息。换句话说,在.Include处,延迟加载再次停止。

所以,奇怪的是,为了让延迟加载首先使用数据库,我必须在ConceptualEntityModel的属性中将“lazy loading Enabled”设置为false

我接着补充说

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore

在应用程序_Start()中,删除了问题中提到的PreserveReferencesHandling。这给了我希望从模型中获得的干净json

还有一个困难仍然存在,但如果没有更好的回应,我将努力解决它。在我的PersonRepository中,我使用:

public IEnumerable<Person> GetAll() {
return db.People
    .Include("C_Departments")
    .AsNoTracking();
}  
public IEnumerable GetAll(){
返回db.People
.包括(“C_部门”)
.AsNoTracking();
}  

让人们和他们的部门相处。不幸的是,如果Departments实体中有一个指向人员的导航属性,它会急切地加载部门的所有成员以及部门信息。换句话说,在.Include,延迟加载再次停止。

我想您已经阅读了所有教程,等等?看这里:是的,教程很好。这并不是说它不起作用。问题是我得到的json看起来像:
{$id:“1”、$value:[{$id:“2”、部门:{$id:“3”、作业:{$id:“4”、$value:[]}、人员:{$id:“5”、$value:[{$ref:“2”}、{$id:“6”、部门:{$ref:“3”}、作业:{$id:“7”、$value:[{$id:“8”,…
我想你已经看过了所有的教程,等等?看这里:是的,教程很好。这并不是说它不起作用。问题是我得到的json看起来像:
{$id:“1”,$values:[{$id:“2”,部门:{$id:“3”,工作:{$id:“4”,$values:[]},人:{$id:“5”,$values:[{$ref:“2”,{$id:“6”,部门:{$ref:“3”},作业:{$id:“7”,$values:[{$id:“8”,…