使用Entity Framework处理历史数据

12
我正在使用.NET 4.0构建一个Windows应用程序,用于创建和组织电子项目。该应用程序主要目的是记录电子元件(零件编号、描述、价格等)的供应商信息,并将它们组织(关联)到项目(成品)中。其中一个要求是跟踪任何给定的供应商物品的更改(主要是价格),以及在项目级别上的更改,以便在组件级别和项目级别提供时点统计更改的详细信息。
我决定使用Entity Framework 4作为我的数据访问层,使用SQL CE 3.5作为数据库,考虑到客户端部署的简单性。数据访问工作很好,但当尝试创建对象之间的关系(关联)时,框架似乎没有明显的方法来使用历史数据。这是我第一次尝试使用实体框架,所以我觉得可能只是我的经验不足阻止我找到答案。以下是我的基本架构:
我有三个主要的表:Project、Product和ProjectProduct
Project和Product表各有一个ID列和一个DateAdded列,它们被用作复杂键。ProjectProducts表具有其他两个表的ID,并维护实体之间的多对多关系。关系表也有一个DateAdded列,用于跟踪产品/项目关联的更改。
虽然实体框架似乎可以很好地维护直接关联(无日期条件)的关系,但在使用标准代码生成的数据对象时,它对于如何加载参数化的时点历史数据架构的关联有些困惑。本质上,我需要能够根据时点要求的日期条件加载数据对象(parametrized loading)。
是否有人做过类似的事情,并且可以指导我正确的方向?
抱歉解释这么长,但提前感谢您能提供的任何帮助!
1个回答

10
我也实现了同样的事情。使用EF4相当容易。你只需处理OnSavingChanges事件,枚举更改项集合,然后按照自己的方式存储它们。
唯一的问题是,获取插入的数据非常棘手(除非您不介意没有新项目的主键,但我不行)。因此,我决定仅跟踪更新和删除操作。
这篇文章向您展示如何做到这一点,尽管我的实现要简单得多(我不喜欢将更改存储在XML中,所以我为列创建了一个单独的表)。 part 2 展示了如何进行回滚,如果您有兴趣的话。
参考链接:使用Entity Framework实现审计跟踪 - 第1部分使用Entity Framework实现审计跟踪 - 第2部分

嗨Neil - 首先,关于使用EF记录审计轨迹的文章非常棒。然而,这并不完全符合我的历史快照记录场景(不同的历史类型)。我在考虑是否需要创建另一层继承自数据对象的对象,并在代码中管理快照关系。我不确定EF能否以这种方式处理历史关系,但也许有人可以证明我是错的。 - Glen
Glen - 针对您的情况,我建议为每个表创建一个归档版本,并插入快照项,而不是插入到通用历史记录表中。这样可以维护表之间的关系。 - Neil N
请确保为每个归档表添加时间戳,以允许正确的时点查询。 - Neil N
谢谢Neil。我正在考虑将归档表情景作为一种可能性。我相当确定,如果我使用支持存储过程的SQL技术(CE不支持),那么我可以使用SP参数来处理历史数据并相应地返回快照对象。我的另一个选择是不让EF处理关系,而是使用另一层继承数据对象的对象,并在代码中管理关系。无论如何,非常感谢您的建议。 - Glen
那些链接中有很棒的信息。我之前看过一个使用存储过程得到相同结果的解决方案,但是那总是很麻烦处理。 - edsobo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接