【问题标题】:Proper change-logging impossible with Entity Framework?使用实体框架不可能进行正确的更改日志记录?
【发布时间】:2012-02-28 15:31:05
【问题描述】:

我想记录使用 Entity Framework 4 对 SQL Azure 数据库所做的所有更改。 但是,到目前为止我还没有找到合适的解决方案..

到目前为止,我可以通过重写 SaveChanges() 并使用 ObjectStateManager 检索所有添加、修改和删除的实体来跟踪所有实体。这工作正常。不幸的是,我似乎无法从关系条目中检索到任何有用的信息。在我们的数据库模型中,我们有一些多对多的关系,我也想记录新的/修改的/删除的条目。

我想将所有更改存储在 Azure 存储中,以便能够跟踪用户所做的更改,并可能回滚到实体的先前版本。

有什么好的方法可以做到这一点吗?

编辑: 我们的场景是托管一个 RESTful WebService,它包含所有业务逻辑并将数据存储在 Azure SQL 数据库中。客户端必须通过 WebService 作为用户进行身份验证,并且我需要存储用户更改数据的信息。

【问题讨论】:

  • SQL Azure 有变更数据捕获吗?
  • @TGnat 根据this page 它没有。
  • @user1165068:你当然可以从 OSM 获得新的/修改的关系。
  • @Craig Stuntz 怎么样?我找不到任何方法来查看哪些外键属于该关系。
  • @user1165068 它们在ObjectStateManager.GetObjectStateEntries() 列表中,就像任何其他实体一样。关系在 EF 中是一等的,这意味着关系本身是实体。

标签: database entity-framework logging entity-framework-4


【解决方案1】:

参见FrameLog,这是我为此目的编写的一个实体框架日志库。它是开源的,包括用于商业用途。

即使您不想使用该库,也可以查看代码以了解处理日志记录关系的一种方法。它处理所有的关系多重性。

具体见the ChangeLogger class中私有方法logRelationshipChange和logForeignKeyChange的代码。

【讨论】:

  • 我可以为 Framelog 担保。在我当前的项目中使用它,它会按照锡上所说的那样做。
【解决方案2】:

您可以通过tracing provider 来完成。

【讨论】:

  • 不幸的是,跟踪提供程序不能与 HibernatingRhinos Profiler 一起工作,这对我们的工作至关重要。它不能将 HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledConnection 转换成 EFProviderWrapperToolkit.DbConnectionWrapper...
【解决方案3】:

您可能只想考虑为此使用数据库触发器。每当更改表中的值时,将该行复制到另一个存档表。它对我来说效果很好。

【讨论】:

  • 我如何获得谁使用这种方法更改了数据库的信息?我最好按场景扩展我的初始帖子。 :)
  • @user1165068:好问题。我通常在我想像这样跟踪的表上包含一个ActorId 属性。这意味着我必须让我的数据访问代码要求消费者在更新时提供当前人的 ID。这不是一个完美的解决方案,因为如果我忘记这样做,我最终可能会将每个更改记录为由最初创建该项目的同一个人所做的。
猜你喜欢
  • 2019-02-21
  • 2018-08-09
  • 2020-02-06
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多