如何在LightSwitch中创建一个简单的审计追踪(Audit Trail)(更改日志)

原文发表地址 How to Create a Simple Audit Trail (Change Log) in LightSwitch

原文发表时间 2011-06-22 08:03

商业应用中最常见的要求就是要捕捉数据记录的变更,并且按类别在历史纪录表中保存。比如,一个雇员的人事记录变更了,你得记录原始值和新值,还有做这些改变的人,这样就可以提供可见的审计追踪。在这期间,你就需要记录更新记录的更新,插入或者删除。那么在这篇博文中,我就会向你展示如何在Visual Studio LightSwitch中创建简单的审计追踪以跟踪记录变化。

创建一个记录表

首先要做的就是创建一个储存变更的表。好吧,我们已经有包含雇员表的应用了,我们希望可以捕捉到任何对表的的更新插入或者删除。那么首先就要添加一个捕捉这些变更的表。使用数据设计器(Data Designer)添加一个新表至应用。我将它命名为雇员变动(EmployeeChange),它所包含的字段如下所示:

Field

Type

ChangeType

String (required)

ChangedBy

String (required)

OriginalValues

String (not required)

NewValues

String (not required)

Updated

Date Time (required)

然后在属性窗口的外观部分,把雇员变动(EmployeeChange)表的Summary属性设置成“Updated”字段。之后,我们要从我们的雇员(Employee)表中向这个表添加一个新的关系。点击设计器上方的“关系”按钮,在去(To)栏中选择雇员(Employee)表。将Multiplicity设置为“0或1”。这就意味着我们的变更记录不需要雇员父记录。为什么不用呢?因为在这个例子中,我们还要跟踪删除的记录信息,但同时也希望这些删除信息留在雇员(Employee)表中。所以我们还需将On Delete Behavior设置到“Dissociate”,这样当雇员记录被删除,我们的审计追踪仍然是完好无缺的。

image

这就是概要的效果了。

image

编写代码以捕捉变更

然后我们需要对数据服务向保存管道中编写一些代码,在插入、更新和删除时进行拦截,并给雇员变动表编写适当的值。要做到这个,只要在数据设计器的雇员表上双击,从右上方拖下“编写代码”按钮。然后你就会看到在General Methods section _Updated / ing, _Inserted / ing, _Deleted / ing 函数。

image

Select _Inserting, _Updating, and _Deleting函数在你的数据服务中创建函数段。然后我们要编写一些选择雇员中储存属性的代码。储存属性是表中的实域。换句话说,我们不想包含任何的计算属性。对那些更新了的雇员记录,我们要比较原始值和当前值,来决定我们是否需要记录变更。我们通过反复深入雇员实体中的“Details”属性来做到这点。这里你能获取许多framework函数以及LightSwitch数据运行时属性。在我们的例子中,我通过关注每个字段的名称和值,用vbCrLf进行分离,用字符串形式记录新的和原始值。当然你也可以选用其他方式,取决于你想如何储存变更表内的记录信息。

  1: Private Sub Employees_Updating(entity As Employee) Dim change = entity.EmployeeChanges.AddNew() change.ChangeType = "Updated" change.Employee = entity change.Updated = Now() change.ChangedBy = Me.Application.User.FullName Dim newvals = "New Values:" 
  2:  
  3: Dim oldvals = "Original Values:" 
  4:  
  5: For Each prop In entity.Details.Properties.All(). OfType(Of Microsoft.LightSwitch.Details.IEntityStorageProperty)() If prop.Name <> "Id" Then 
  6:  
  7: If Not Object.Equals(prop.Value, prop.OriginalValue) Then 
  8:  
  9: oldvals += String.Format("{0}{1}: {2}", vbCrLf, prop.Name, prop.OriginalValue) newvals += String.Format("{0}{1}: {2}", vbCrLf, prop.Name, prop.Value) End If 
  10:  
  11: End If 
  12:  
  13: Next 
  14:  
  15: change.OriginalValues = oldvals change.NewValues = newvals
  16:  
  17: End Sub Private Sub Employees_Inserting(entity As Employee) Dim change = entity.EmployeeChanges.AddNew() change.ChangeType = "Inserted" change.Employee = entity change.Updated = Now() change.ChangedBy = Me.Application.User.FullName Dim newvals = "Inserted Values:" 
  18:  
  19: For Each prop In entity.Details.Properties.All(). OfType(Of Microsoft.LightSwitch.Details.IEntityStorageProperty)() If prop.Name <> "Id" Then 
  20:  
  21: newvals += String.Format("{0}{1}: {2}", vbCrLf, prop.Name, prop.Value) End If 
  22:  
  23: Next 
  24:  
  25: change.NewValues = newvals
  26:  
  27: End Sub Private Sub Employees_Deleting(entity As Employee) Dim change = entity.EmployeeChanges.AddNew() change.ChangeType = "Deleted" change.Updated = Now() change.ChangedBy = Me.Application.User.FullName Dim oldvals = "Deleted Values:" 
  28:  
  29: For Each prop In entity.Details.Properties.All(). OfType(Of Microsoft.LightSwitch.Details.IEntityStorageProperty)() If prop.Name <> "Id" Then 
  30:  
  31: oldvals += String.Format("{0}{1}: {2}", vbCrLf, prop.Name, prop.Value) End If 
  32:  
  33: Next 
  34:  
  35: change.OriginalValues = oldvalsEnd Sub 

创建屏幕以察看审计追踪

最后但也是最关键的是我们需要创建一个屏幕来查看审计追踪。你不需要用户来修改这些记录,只是查看,所以选用搜索数据屏幕模板(Search Data Screen template)是最合适的选择。

image

然后在屏幕设计器中,选择Updated字段,取消“以链接显示”,这样用户就不能修改记录了。假设你已经有一个定义的雇员屏幕了,那就点击F5,运行程序,打开你的雇员屏幕。对现有记录做些改动,添加一项新的或者删除另一个,来测试所有的三个场景。然后打开审计追踪搜索屏幕,看看结果如何。你会看到和下图差不多的内容:

image

如果你需要在多个表上进行变更跟踪,你可以用同样的方法从一个单一审计表添加关系至其他表。雇员只是一个例子而已。亲自试验一下所给的代码,以记录确切地变更。我希望这些内容能对你为LightSwitch应用创建简单的审计追踪有些帮助。

希望你们喜欢!