1

我正在寻找使用 EF 数据库优先方法和 MVC 4.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 非常适合这一点。当然,如果修改内脏是正确的答案,我会接受的。

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

谢谢

编辑
最有可能导致我的部分问题的附加信息。在某些时候,为了使上述内容起作用,我在 Global.asax.cs 中添加了以下内容:

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

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

4

1 回答 1

1

因此,奇怪的是,为了首先让延迟加载与数据库一起工作,我必须在 ConceptualEntityModel 的属性中将“启用延迟加载”设置为 false。

然后我添加了

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

在 Application_Start() 中并删除了上述问题中提到的 PreserveReferencesHandling。这给了我我想要的模型中的干净 json。

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

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

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

于 2013-07-11T15:29:06.273 回答