商信互联
该eXpressApp框架为WinForms和ASP.NET应用程序提供审计跟踪系统。该系统旨在为您提供有关对应用程序的持久对象进行的更改的信息。例如,您可以检索有关更改种类(创建,更改对象等),更改对象,对象,先前和新属性值等的信息。在对象保存到数据存储的两个连续事件之间记录了更改。要在您的应用程序中使用此系统,应使用代表它的Audit Trail模块。本主题说明了跟踪对象更改的机制,并提供了自定义它们的方法。
当前,我们在此模块中不提供对实体框架(EF)的内置支持,因为其实现在很大程度上取决于我们的XPO ORM,并且在这方面,我们没有足够的客户请求。如果您在XAF应用程序中使用EF进行数据访问并需要类似的功能,请随时与我们联系并描述您的业务需求,以便我们为您提供替代解决方案。通常,您可以为Entity Framework集成任何自定义或标准解决方案,将其实施以解决非XAF应用程序中的相同要求。我们还将在这方面继续监视用户需求,并且将来可能会审查我们当前的决定。
该AuditTrailModule由表示DevExpress.ExpressApp.AuditTrail.v 19.2的.dll组件。要在应用程序中使用该模块,请分别通过Application Designer或Module Designer将其添加到您的应用程序项目或一个应用程序模块中。此外,请检查您的应用程序中是否引用了DevExpress.Persistent.Base.v 19.2 .dll程序集,因为该程序集包含Audit Trail模块使用的XAF无关服务。
使用解决方案向导创建新的XAF解决方案时,可以将模块添加到应用程序中。为此,请在“选择其他模块”步骤中选择模块。
在引用了上面列出的必要程序集之后,将审核应用程序中的所有持久对象。此外,它们的简单,引用和集合属性(它们是持久性的)也将被审核。对这些对象及其属性所做的更改将记录在数据库中。
下表列出了“审核跟踪”模块记录的更改:
改变 | 描述 |
---|---|
创建对象 | 已审计的对象已创建。 |
InitialValueAssigned | 在第一次保存之前,已将初始值分配给审核的对象。 |
ObjectChanged | 被审核对象的属性已更改。 |
对象已删除 | 被审核的对象已被删除。 |
已添加到收藏集 | 已审核的对象已添加到集合中。 |
RemovedFromCollection | 已审计的对象已从集合中删除。 |
CollectionObjectChanged | 来自已审核对象的对象已更改。 |
AggregatedObjectChanged | 由审核对象聚合的对象已更改。 |
自订资料 | 自定义数据已添加到审核日志中。 |
在代码中,更改由AuditDataItem类表示。记录此类的属性。默认情况下,它们由AuditDataStore对象保存到数据库中。该对象创建一个AuditDataItemPersistent持久对象并将其保存到数据库。若要将AuditDataItem对象表示的更改保存在另一个存储中,请从AuditDataStore类继承一个自定义类并覆盖Save方法(请参阅自定义Audit Trail系统主题)。
要分析审核日志,您需要知道哪些数据库表代表该日志。使用“审核跟踪”模块,将以下表添加到数据库中:
AuditDataItemPersistent
表示存储AuditDataItemPersistent对象的表。每次进行上面列出的更改之一时,都会向该表中添加一条新记录。该表的AuditedObject字段包含对AuditObjectWeakReference表中相应记录的引用。该的OLDobject和NewObject的字段包含在相应的记录的引用XPWeekReference表。这些字段的字符串表示形式分别存储在OldValue和NewValue字段中。
XPWeak参考
包含有关已更改对象的数据。对象标识符存储为字符串。
AuditedObjectWeakReference
包含有关已更改的对象和参与更改的对象的数据。对象标识符存储在GuidId或IntId字段中,具体取决于它们是存储为Guid还是整数值。因此,与通过XPWeakReference表相比,AuditedObjectWeakReference表代表了一种更方便的访问对象数据的方法。
如果这些更改是在未经审核的会话中执行的,则可能会丢失某些对象更改。如果您手动创建一个Session或UnitOfWork,则会发生这种情况。为了避免这种故障,当需要创建自己的Session或UnitOfWork时,请使用Application.CreateObjectSpace方法:
IObjectSpace objectSpace = Application.CreateObjectSpace(typeof(MyBusinessClass));
Dim objectSpace As IObjectSpace = Application.CreateObjectSpace(GetType(MyBusinessClass))
不要写如下语句: