如何在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”,这样当雇员记录被删除,我们的审计追踪仍然是完好无缺的。
这就是概要的效果了。
编写代码以捕捉变更
然后我们需要对数据服务向保存管道中编写一些代码,在插入、更新和删除时进行拦截,并给雇员变动表编写适当的值。要做到这个,只要在数据设计器的雇员表上双击,从右上方拖下“编写代码”按钮。然后你就会看到在General Methods section _Updated / ing, _Inserted / ing, _Deleted / ing 函数。
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)是最合适的选择。
然后在屏幕设计器中,选择Updated字段,取消“以链接显示”,这样用户就不能修改记录了。假设你已经有一个定义的雇员屏幕了,那就点击F5,运行程序,打开你的雇员屏幕。对现有记录做些改动,添加一项新的或者删除另一个,来测试所有的三个场景。然后打开审计追踪搜索屏幕,看看结果如何。你会看到和下图差不多的内容:
如果你需要在多个表上进行变更跟踪,你可以用同样的方法从一个单一审计表添加关系至其他表。雇员只是一个例子而已。亲自试验一下所给的代码,以记录确切地变更。我希望这些内容能对你为LightSwitch应用创建简单的审计追踪有些帮助。
希望你们喜欢!