2013-07-09 67 views
1

我正在寻找使用EF数据库优先方法和MVC 4.5/Web API构建Web应用程序的最简单,最佳实践的方法。我的应用程序将使用角度框架使ajax调用按需检索json数据。使用Web API的实体框架5

目前,我得到了过度和结构不良的数据,以回应我的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: '[email protected]', Department: 'ABC'}, 
{Name: 'bob', Email: '[email protected]', Department: 'CDE'}] 

我猜想这意味着通常主要实体将被急切加载,但n所有其他具有对Person的依赖关系的表。但是有时我会想用这些后面的引用来获得一个人可能正在或正在请求的所有工作。

如果可能的话,我宁愿不必诉诸于修改T4模板的东西。虽然这很聪明,但它不是很灵活。另外,我不喜欢被赋予电源工具的想法,并告诉我必须在使用之前研究原理图并重新连接内部。我不是一个专业的开发人员,真的很想专注于工作,而不是工具; Linq2Sql对此非常好。当然,如果修改内脏是正确的答案,我会接受。

这似乎是Web API的这种直接使用,我确信我错过了一些明显的东西。

感谢

编辑
附加信息是最有可能导致我的问题的一部分。在某些时候,得到上述工作,我增加了以下内容的Global.asax.cs:

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

随着预先加载,在乔布斯的两个领域是指人导致循环引用。上面的代码允许Json.Net序列化它,但用不需要的数据填充json。我相信解决方案是以某种方式切换到延迟加载,但是这可以在数据库第一种方法中完成吗?

+0

我想你已经通过了所有的教程等?看到这里:http://www.asp.net/web-api/overview/creating-web-apis/using-web-api-with-entity-framework/using-web-api-with-entity-framework,-第1部分 –

+0

是的,教程很好。这并不是不行。问题是我回来的json看起来像:'{$ id:“1”,$ values:[{$ id:“2”,Departments:{$ id:“3”,Jobs:{$ id:“ 4“,$ values:[]},人物:{$ id:”5“,$ values:[{$ ref:”2“},{$ id:”6“,Departments:{$ ref:”3“ },工作:{$ id:“7”,$ values:[{$ id:“8”,...' – bob

回答

1

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

我然后在加入的Application_Start

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

()和除去PreserveReferencesHandling如在上述问题中提到。这给了我从我的模型中得到的干净的json。

仍然存在一个难题,但除非有更好的反应,否则我会解决它。在我的PersonRepository中,我使用:

public IEnumerable<Person> GetAll() { 
return db.People 
    .Include("C_Departments") 
    .AsNoTracking(); 
} 

让人与他们的部门一起。不幸的是,如果部门实体中有一个导航属性指向人员,它会连同部门信息一起加载部门的所有成员。换句话说,在.Include中,延迟加载会再次停止。