实体框架:创建更改历史记录

时间:2010-07-01 13:13:40

标签: asp.net entity-framework ado.net entity-framework-4

我有一个EDM(phoneDB),可以为后端MSSQL数据库建模。我开发了一个ASP.NET(VB)应用程序,允许用户编辑该数据库中的信息。当有人编辑记录条目时,我想记录此操作。

现在,我正在做以下事情:

  

For Each ..Next,检查条目是否是已修改其entitystate的对象。

     

如果不是......如果这确保我们不处理关系实体或空实体。

现在这是模糊的地方。我想要做的是从这些修改过的对象中获取信息并将它们记录到数据库中。现在我有这样的事情:

Dim audit as History
audit.action = "Changed information in " & propName & " to " & entry.CurrentValues(propName) & " from " & entry.OriginalValues(propName)
audit.action_by = this_user
audit.action_date = Date.Now
audit.extension_id =
但是,我不确定如何告诉它从入境中提取特定财产。例如,我需要得到(伪代码)类似的东西:

audit.extension_id = entry.OriginalValues(extension_id)

2 个答案:

答案 0 :(得分:1)

我不明白“从一个条目中提取特定财产”是什么意思?您编写的(伪)代码并不多,您的案例中的extesion_id是什么?如果extension_id是实体的属性名称,那么通过调用entry.OriginalValues(“extension_id”)获得它的原始值,但我很确定你知道这一点。

顺便说一句,您可以使用触发器在数据库本身中进行错综复杂的历史记录,而不需要知道数据层。这是一个相当古老的技巧并且工作得很快,请参阅this

答案 1 :(得分:0)

以下是我最终如何完成它:

  Private Shared Sub context_SavingChanges(ByVal sender As Object, ByVal e As EventArgs)
        ' This allows us to record a history of the changes made by the user to the database. The record is created automatically by EF, but we need to save it to the database
        ' for permanent retention.
        For Each entry As ObjectStateEntry In DirectCast(sender, ObjectContext).ObjectStateManager.GetObjectStateEntries(EntityState.Modified)
            If Not entry.IsRelationship And entry.Entity IsNot Nothing Then
                For Each propName As String In entry.GetModifiedProperties()
                    Dim context As New AppsEntities()
                    Dim audit As New History
                    audit.action_note = "Changed information in " & propName & " to " & entry.CurrentValues(propName) & " from " & entry.OriginalValues(propName)
                    audit.action_by = CStr(HttpContext.Current.Session("person_name"))
                    audit.action_date = Date.Now
                    audit.extension_id = entry.CurrentValues.GetValue(0)
                    context.AddToHistories(audit)
                    context.SaveChanges()
                Next

            End If

        Next
    End Sub