2013-10-06 133 views
1

我正在使用实体框架开发一个巨大的项目。因为我几乎所有的实体都是时间依赖的,所以不可能再使用实体之间的关系(我自己管理关系)。 出现的问题是我不能再像以前那样容易地查询数据。假设我有一个实体叫做Student。该实体包含属于该学生的Books(列表)的集合。每本书都包含一个来自数据库的作者属性。 要加载所有的学生与他们的书和相应的作者,我要么编写数百个自定义查询(f.e. l​​inq),要么懒惰加载它们,这会导致巨大的性能影响。 事实上,如果我可以使用实体框架的无关联,那将是非常好的。有人知道如何做到这一点?谢谢。实体框架包含无关系

回答

3

如果实体框架没有管理表之间的关系,那么它将无法使用.Include()这会在SQL调用中创建连接。正常情况下,您最好的选择是将相关实体添加到父项,但使用[NotMapped]属性。然后,您可以使用自定义SQL调用来执行查找并在需要时填充属性。然而,我很困惑,因为你的陈述认为,因为实体是“时间依赖的”,所以你不能使用关系,这些关系只是数据库中的外键。也许还有其他的事情可以用来优化你的实体。如果你正在管理你自己的项目之间的关系,你正在将你的数据库中的许多责任卸载到你的应用程序中,这看起来已经很多了。

更新

实施跟踪审核是实体框架中一个相当标准的过程,可能比管理你的关系要容易得多。审计跟踪基本上涉及拥有Context_SavingChanges()方法的事件处理程序,然后通过ObjectStateManager处理新数据和旧数据。在此循环中添加逻辑,您也可以使不属于特定时间范围内的添加/更新无效或拒绝。

审计管理器的一个很好的例子是CodeProject,其中作者演示了一种不仅存储审计信息而且还回滚的方法。

+0

谢谢安德鲁!我决定删除所有关系,因为我需要将所有数据留在数据库中,并且随着时间的推移一个条目可以具有不同的值。另外,实体之间的关系只能在特定的时间范围内有效。我不知道如何使用实体框架关系来实现这样的系统?似乎没有支持这样的scenerio.However我认为应该有可能编写一个自定义的包含方法扩展与一个额外的参数,该参数定义关系(哪个表(DbSet)的联接应该作出哪些外键是)。任何想法如何做到这一点? – sjkm

+0

有一些方法可以在实体框架中实现审计跟踪,并且管理关系的有效性非常简单...我将用一些链接更新我的答案。 – Claies

+0

谢谢安德鲁你的时间!我很感激。过去我曾经使用Audit Trail,但这次应该可以在一秒钟之内将整个系统的状态改变为特定的时间点。换句话说,应该可以同时模拟两个不同的时间点。你能告诉我更多关于[NotMapped]属性的信息吗?公平的努力不可能用另一种名为IncludeNotMappedRelation(这个IQueryable,property,relationToDbSet,foreignKey)的方法来扩展IQueryable吗? – sjkm