【问题标题】:Entity Framework Include without Relations实体框架包含无关系
【发布时间】:2013-10-06 13:51:46
【问题描述】:

我正在使用实体框架进行一个大型项目。因为我使几乎所有实体都与时间相关,所以不再可能使用实体之间的关系(我自己管理关系)。 出现的问题是我不再能够像以前那样轻松地查询数据。 假设我有一个名为Student 的实体。该实体包含属于学生的Books(列表)的集合。每本书都包含一个作者属性,该属性也来自数据库。 要加载所有学生的书和相应的作者,我要么必须编写数百个自定义查询(例如 linq),要么延迟加载它们,这会对性能产生很大影响。 实际上,如果我可以在没有关系的情况下使用实体框架的 Inlude,那就太好了。有谁知道如何实现这一目标?谢谢。

【问题讨论】:

    标签: c# sql-server database entity-framework


    【解决方案1】:

    如果实体框架不管理表之间的关系,则它无法使用.Include(),这会在 SQL 调用中创建连接。您最好的选择是像往常一样将相关实体添加到父级,但使用[NotMapped] 属性。然后,您可以使用自定义 SQL 调用来执行查找并在需要时填充属性。但是,我对您的陈述感到困惑,因为实体是“时间相关的”,您不能使用关系,这些关系只是数据库中的外键......也许您可以做一些其他事情来优化您的实体。如果您要管理自己的项目之间的关系,那么您正在将大量责任从数据库转移到您的应用程序中,这似乎已经是很多工作了。

    更新

    在 Entity Framework 中实施审计跟踪是一个相当标准的过程,并且可能比管理您的关系容易得多。审计跟踪基本上包括为Context_SavingChanges() 方法提供一个事件处理程序,然后通过ObjectStateManager 处理您的新数据和旧数据。在此循环中添加逻辑,您还可以使不属于特定时间范围内的添加/更新无效或拒绝。

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

    【讨论】:

    • 谢谢 Andrew!我决定删除所有关系,因为我需要将所有数据保留在数据库中,并且随着时间的推移,条目可以具有不同的值。此外,实体之间的关系只能在特定的时间范围内有效。我不知道如何使用实体框架关系来实现这样的系统?似乎不支持这样的场景。但是我认为应该可以编写一个自定义的 Include 方法扩展,其中包含一个定义关系的附加参数(应该连接到哪个表(DbSet)以及哪个外键是).知道怎么做吗?
    • 有一些方法可以在实体框架中实现审计跟踪,并且管理关系的有效性很容易......我会用一些链接更新我的答案。
    • 感谢 Andrew 抽出宝贵时间!我很感激。过去我曾经使用 Audit Trail,但这次应该可以在一秒钟内将整个系统的存在状态更改为特定时间点。换句话说,应该可以同时模拟两个不同的时间点。你能告诉我更多关于 [NotMapped] 属性的信息吗?是否不可能通过另一种名为 IncludeNotMappedRelation(this IQueryable, property, relationToDbSet, foreignKey) 的方法来扩展 IQueryable?
    【解决方案2】:

    如果实体之间没有主键和外键关系,则不能使用 Include 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多