【问题标题】:Breeze and Point In Time Entities微风和时间点实体
【发布时间】:2013-11-21 01:53:48
【问题描述】:

我们正在创建一个允许用户为其客户创建和修改账单的系统。出于审计目的,这些修改需要作为法案的一部分进行维护。它在某种程度上是一个时间点架构,但我们并不仅仅通过修订来跟踪时间。这是一个在客户端和服务器上使用 Breeze 的 ASP.NET MVC 5、WebAPI2、EntityFramework 6、SQL Server 应用程序。

我正试图弄清楚如何让 Breeze 和我们的数据模型恢复正常工作。当我们修改一个实体时,我们基本上保留了旧行,用修改复制它并更新一些实体状态字段w/日期/时间/修订号等等。我们始终可以根据实体 ID 和 EditState 字段获取最新版本的实体,其中“1”是最新的。

我制作了一个小型示例应用程序,以使 Breeze 作为解决方案的一部分工作,并在客户端上启用一些不错的 SPA 架构和内联编辑,这一切都有效......除了因为我们的实体框架代码自动创建一个包含修改的新实体,SaveChanges 响应包含原始实体但不包含新的“更新”实体。在客户端上重新加载数据是可行的,但除了为了演示目的而四处乱窜之外,这样做当然是愚蠢的。

所以我创建了一个新的 ContextProvider 并从 EFContextProvider 继承,覆盖了 AfterSaveEntities 方法,然后事情变得更复杂了。并非所有实体都具有此“时间点”/修订功能,但大多数实体都有。如果他们这样做,我可以像上面所说的那样使用其 EntityId 和 EditState 获取该实体的最新版本,但我没有看到获取新实体的直接方法(对于 EF 来说非常新,对于 Breeze 来说非常新)所以我我希望在这里找到一些指针。

这个解决方案是在 Breeze 中还是在我们的 DataContext 中?我可以做一些反思,获取类型,查询更新的实体并将其推入 saveMap。似乎这可能会在某个时候崩溃(不确定如何或何时,但似乎很粗略)。我们的架构不好吗?我们是否应该通过创建审计/日志表来存储修改后的值,而不是通过将实体的所有修订保留在其原始表中但使用修订信息并使查询稍微复杂一些来保持数据模型更小?我只是在 EF 中遗漏了一些东西吗?

... 作为显而易见的回应,我知道我们应该使用文档数据库,但这不是这个项目的一个选项。我们被困在关系领域。

【问题讨论】:

    标签: sql entity-framework breeze


    【解决方案1】:

    我还没有尝试过,但另一种方法是简单地将 BeforeSaveEntities 方法中传入实体的 EntityState 从已修改更改为已添加。您可能还需要更新此“新”实体中的某些版本字段,使其不会与原始实体发生主键冲突。

    但是...在过去构建过这样的应用程序后,我真的推荐另一种方法。将每种类型的“历史”实体存储在单独的表中。它可以与“当前”表的形状完全相同。当您保存时,首先将“当前”实体复制到“历史”表中(再次使用一些版本编号或主键的日期模式),然后正常更新您的“当前”实体。

    【讨论】:

    • 感谢您的回复。我今天会做这个。我们避开了历史记录表,因为历史记录是此计费文档的一个重要方面,而不是严格用于传统的审计或变更跟踪。这些修改是文档生命周期的一部分,直到它被计费,我们不想让查询过于复杂......在一个地方简单 -> 在其他地方更复杂。顺便提一句。微风是惊人的。我一直在翻阅 Noye 的 Pluralsight 系列,并惊讶于我们花了多少时间来处理 Breeze/MV*M/ORM 之前的架构结果
    【解决方案2】:

    这可能不会给您预期的答案,但这里有一个想法:

    保存对象时,在服务器上截取保存,您会得到一个需要修改的对象实例,从具有相同 ID 的数据库中读取对象,将该旧对象的副本放入数据库中的旧表并继续保存进入主表。这样,只有最新版本保留在主表中,而旧表将包含所有以前的版本。

    因此,您需要做的就是拥有两个包含相同对象的表:

    public DbSet<MyClass> OriginalMyClasses{get;set;}
    public DbSet<MyClass> LegacyMyClasses{get;set;}
    

    重写SaveChanges函数并在入口E状态为Modified时拦截,读取E类型,获取原始表和遗留表,从Origin读取与E相同ID的对象O,将O保存到Legacy表,最后返回base.SaveChanges( ); (让它默认保存)。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2014-11-02
      • 2013-04-05
      • 2014-04-08
      • 1970-01-01
      • 2013-03-22
      • 2013-05-17
      • 2018-05-13
      • 2014-03-01
      相关资源
      最近更新 更多