在.NET开发中,有时我们需要跟踪和记录对象属性值的变化,特别是在数据审计、日志记录或业务逻辑监控等场景。这个任务可以通过实现一个自定义的属性变更跟踪系统来完成,这通常涉及到对对象的属性访问进行拦截和处理。下面将详细介绍如何在.NET中实现属性值变更自动记录到数据库的功能。我们需要创建一个基类BaseModel,这个基类将包含处理属性变化的核心逻辑。当属性值发生变化时,系统应该能够捕获这一变化并记录相关信息。在.NET中,我们可以利用属性的setter方法来实现这一功能。对于每个可变属性,我们可以在setter内部添加代码来检查新值和旧值是否相同,如果不同,则触发记录行为。

`public abstract class BaseModel {

private Dictionary<string, object> _propertyValues = new Dictionary<string, object>();

protected void SetProperty<T>(string propertyName, T value) {

    if (_propertyValues.ContainsKey(propertyName)) {

        if (!EqualityComparer<T>.Default.Equals(_propertyValues[propertyName], value)) {

            //记录旧值和新值

            var oldValue = _propertyValues[propertyName];

            var newValue = value;

            //调用记录变更的方法

            OnPropertyValueChanged(propertyName, oldValue, newValue);

        }

    } else {

        _propertyValues.Add(propertyName, value);

    }

    _propertyValues[propertyName] = value;

}

protected virtual void OnPropertyValueChanged<T>(string propertyName, T oldValue, T newValue) {

    //这里可以进一步实现记录到数据库的逻辑

    //例如,创建一个实体,将字段名、旧值、新值保存,然后通过数据库上下文进行保存

}

}`

BaseModel中的SetProperty方法负责检测属性值的变化,并调用OnPropertyValueChanged方法来处理这些变化。你可以根据具体需求扩展OnPropertyValueChanged,比如将变更信息保存到一个数据库表中,用于日后的查询和分析。在实际应用中,你可能需要一个数据库模型来存储这些变更记录。创建一个PropertyChangeLog实体,包含字段如EntityId(引用发生变更的对象的主键)、FieldName(属性名)、OldValue(旧值)、NewValue(新值)以及ChangeTime(变更时间)。然后,在OnPropertyValueChanged中,实例化PropertyChangeLog对象并将这些信息填入,最后通过数据库上下文(如DbContext)保存到数据库。

`public class PropertyChangeLog {

public int Id { get; set; }

public string EntityId { get; set; }

public string FieldName { get; set; }

public string OldValue { get; set; }

public string NewValue { get; set; }

public DateTime ChangeTime { get; set; }

}

public class AuditDbContext : DbContext {

public DbSet<PropertyChangeLog> PropertyChangeLogs { get; set; }

//实现SaveChanges方法,将变更记录保存到数据库

public override int SaveChanges() {

    var changeTracker = ChangeTracker;

    foreach (var entry in changeTracker.Entries<BaseModel>()) {

        entry.Entity.OnPropertyValueChanged(entry.Property(x => x.Id).CurrentValue, entry.State);

    }

    return base.SaveChanges();

}

}`

AuditDbContext中,我们重写了SaveChanges方法,遍历所有处于跟踪状态的BaseModel实例,调用它们的OnPropertyValueChanged方法。这样,每次对数据库的更改都会触发属性变更的记录。

相关链接:

  1. .net属性值变更自动记录到数据库v2

  2. 实体属性变更历史记录框架变更历史记录从此无忧

  3. 如何查看数据库变更记录

.net属性值变更自动记录到数据库