【发布时间】: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