【问题标题】:Using Entity Framework with historical data将实体框架与历史数据结合使用
【发布时间】:2011-09-29 18:42:46
【问题描述】:

我正在 .Net 4.0 中构建一个 Windows 应用程序来创建和组织电子项目。该应用程序的主要目的是记录电子元件的供应商信息(零件编号、描述、价格等)并将它们组织(关联)到项目(成品)中。其中一项要求是跟踪任何给定供应商项目(主要是价格)的更改以及项目级别的更改,以便在组件级别和项目级别的更改详细信息提供时间点统计信息。

考虑到客户端部署的简单性,我决定将 Entity Framework 4 用于我的数据访问层,并将 SQL CE 3.5 用于数据库。数据访问效果很好,但是在尝试创建对象之间的关系(关联)时,框架似乎没有任何明显的方式来使用历史数据。这是我第一次尝试使用实体框架,所以我认为可能只是我的经验不足让我无法找到答案。这是我的基本架构:

我有 3 个主表:Project、Product 和 ProjectProduct

Project 和 Product 表各有一个 ID 列和一个 DateAdded 列,用作复杂键。 ProjectProducts 表具有其他两个表的 ID,并维护实体之间的多对多关系。关系表还有一个 DateAdded 列,用于跟踪产品/项目关联的变化。

虽然实体框架在使用标准代码生成的数据对象维护直接(无日期标准)的关联方面似乎工作得很好,但在如何让它加载关联以获取一个点时有点令人困惑-时间历史数据模式。本质上,我需要能够根据时间点要求的日期标准加载数据对象(参数化加载)。

有没有人做过类似的事情并且可以指出正确的方向?

很抱歉解释太长,但提前感谢您提供的任何帮助!

【问题讨论】:

    标签: .net entity-framework entity-framework-4 entity-relationship


    【解决方案1】:

    我实现了完全相同的东西。使用 EF4 非常容易。您基本上处理 OnSavingChanges 事件,并枚举更改的项目集,随意存储它们。

    唯一的问题是,插入项目非常棘手(除非您可以接受没有新项目的主键,但我没有)我决定只跟踪更新和删除。

    本文向您展示了如何做到这一点,尽管我的实现要简单得多(我不喜欢在 XML 中存储更改,所以我为列创建了一个单独的表)

    Implementing Audit Trail using Entity Framework - Part 1

    第 2 部分展示了如何进行回滚,如果您对此感兴趣的话。

    Implementing Audit Trail using Entity Framework - Part 2

    【讨论】:

    • 嗨 Neil - 首先,关于使用带有审计跟踪记录的 EF 的精彩文章。但是,这与我的历史快照记录场景(不同的历史类型)并不完全匹配。我在想我可能需要创建另一层对象,这些对象继承自数据对象并在代码中管理快照关系。我不知道 EF 可以以这种方式处理历史关系,但也许有人可以证明我错了。
    • Glen - 那么在你的情况下,我会为每个表创建一个存档版本,并将快照项插入到通用历史表中。这样您就可以维护表之间的关系。
    • 请务必为每个存档表添加时间戳以允许进行属性时间点查询
    • 谢谢尼尔。我正在将存档表场景视为一种可能性。我很确定,如果我使用支持存储过程(CE 不支持)的 SQL 技术,那么我可以使用 SP 参数来处理历史数据并相应地返回快照对象。我的另一个选择是不让 EF 处理关系,而是使用另一层对象继承数据对象并管理代码中的关系。无论如何,非常感谢您的建议。
    • 这些链接中的信息很棒。我以前见过一个解决方案,它使用存储过程产生了相同的结果,但这总是一个巨大的痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多