c# - 我如何在 NHibernate 中进行通用字段和组件级更改跟踪?

标签 c# .net nhibernate auditing change-tracking

在我的应用程序中,我有几种不同类型的实体,我需要对其进行字段级更改跟踪。我已经用谷歌搜索了这个,只能想出一些关于做简单的“插入日期”和“更新日期”审计跟踪的例子,你只需修改已经持久化的实体上的字段。我的要求更复杂,因为:

  1. 我需要创建代表更改的新实体,而不仅仅是修改正在保存的实体上的字段(就像我发现的插入日期、更新日期示例一样)
  2. 我需要在更新跟踪实体的同一事务中将这些新实体保存到数据库
  3. 我需要跟踪对附加到被跟踪实体的 ValueObjects 集合的更改
  4. 我不想为每个被跟踪的实体编写单独的日志记录代码

示例代码:

public interface ITrackChanges {}
{
}

public class Account : ITrackChanges
{
    public int Id;
    public string AccountNumber;
    public string CustomerName;
    public string CustomerAddress;
}

public class Computer : ITrackChanges
{
    public int Id;
    public string AssetTag;
    public string SerialNumber;
    public IEnumerable<IPAddress> IPAddresses;
}

public class IPAddress : ValueObject
{
    public string Address;
}

每当帐户或计算机对象的任何值发生变化或与计算机对象关联的 IP 地址列表发生变化时,我都需要创建并保存这些实体更改记录:

public class EntityChange
{
    public string EntityType;
    public string EntityId;
    public string PropertyName;
    public string OldValue;
    public string NewValue;
}

每个被跟踪的实体都实现了 ITrackChanges 标记接口(interface),每个值对象都继承自 ValueObject 基类。值对象被映射为 NHibernate 中的组件。

作为我希望获得的最终结果的示例,如果我使用 Id 1 更新 Computer 对象并将 AssetTag 从“ABC123”更改为“ABC124”并将 IP 地址列表从 {“1.2.3.4"} 到 { "1.2.3.4", "1.2.3.5"},我应该得到 2 个 EntityChange 记录:

EntityChange #1
{
    EntityType = "Computer"
    EntityId = 1
    PropertyName = "AssetTag"
    OldValue = "ABC123"
    NewValue = "ABC124"
}

EntityChange #2
{
    EntityType = "Computer"
    EntityId = 1
    PropertyName = "IPAddresses"
    OldValue = "1.2.3.4"
    NewValue = "1.2.3.4, 1.2.3.5"
}

关于最佳实现方式的任何想法?从我对文档的阅读来看,我似乎需要编写一个拦截器和/或事件监听器,但除了一些仅修改正在更新的实体的示例之外,我还没有找到任何示例。绝对欢迎在任何答案中使用示例代码。

我假设这应该是 NHibernate 支持的东西是错误的吗?我能够在以前使用 LLBLGen 作为 ORM 的应用程序中实现它,但这是我第一次必须在使用 NHibernate 的应用程序中实现它。

最佳答案

您想要的是使用 session 拦截器。 您可以找到使用它进行审计的示例 here

此外,您可能会从 NHibernate mail list 获得更多回复.

关于c# - 我如何在 NHibernate 中进行通用字段和组件级更改跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511348/

相关文章:

c# - 与 Mac 配对会导致 Visual Studio 卡住

c# - 如何打破 IAsyncResult?

.net - WCF 服务无法登录到远程数据库

nhibernate - C# 任务并行库和 NHibernate/Spring.NET

c# - ODP.NET 托管驱动程序在连接到 Oracle 数据库时引发异常

NHibernate 一对一映射,非主键

c# - 如何在 C# 中以编程方式确定类型是否接受 null 值?

c# - 自动完成 : Asynchronous population with WCF using threads

c# - 是否有用于 ASP.NET MVC 的混合身份验证配置 ASP.NET 模块 (MADAM) 的端口?

c# - 如何筛选 SharePoint 上的列表