如何在保存更改之前修改DB上下文实体的当前值?

本文关键字:实体 上下文 修改 保存更改 DB | 更新日期: 2023-09-27 18:09:55

我在实体框架中做数据库第一建模为了简单起见我们假设我有两个相关的表

我的实体类

public partial class JournalEntryCode
{
    public JournalEntryCode()
    {
        this.JournalEntries = new HashSet<JournalEntry>();
    }
    public int journal_entry_code_pk { get; set; }
    public string journal_entry_code { get; set; }
    public System.DateTime tstamp { get; set; }  
    public virtual ICollection<JournalEntry> JournalEntries { get; set; }  
}

public partial class JournalEntry
{
    public long journal_entry_pk { get; set; }
    public int journal_entry_code_pk { get; set; }
    public string journal_entry { get; set; }
    public System.DateTime tstamp { get; set; }
    public virtual JournalEntryCode JournalEntryCode { get; set; }
}

这就是我想做的…

SaveChanges方法中,我想添加一个进程,该进程循环遍历DbContext中任何修改的条目,并更新每个修改条目的tstamp属性,以反映在调用SaveChanges时设置的单个tstamp值…有简单的方法吗?

假设在 JournalEntryCodedb上下文中我有两条记录一条是journal_entry_code_pk(2)另一条是journal_entry_code_pk(5)它们都修改了journal_entry_code属性

我想将这两个条目的tstamp值设置为当前值的相同值

DateTime tstamp = DateTime.UtcNow;

我不知道如何修改tstamp属性在上下文中记录的当前状态值。

如何在保存更改之前修改DB上下文实体的当前值?

最简单的方法是定义一个像

这样的接口
public interface ITimeStamped
{
    DateTime TimeStamp { get; set; }
}

,让JournalEntryJournalEntryCode实现。实体框架将(也不能)不使用接口,但是你可以,例如在你的上下文类中重写SaveChanges

public override int SaveChanges()
{
    DateTime tstamp = DateTime.UtcNow;
    var timeStampedEntities = this.ChangeTracker.Entries()
                                  .Where(e => e.State == EntityState.Added
                                           || e.State == EntityState.Modified)
                                  .Select(e => e.Entity).OfType<ITimeStamped>();
    foreach (var timeStamped in timeStampedEntities)
    {
        timeStamped.TimeStamp = tstamp;
    }
    return base.SaveChanges();
}

但是您应该(也许已经)意识到这样一个事实:当涉及到事件的确切顺序时,客户机上时钟的微小差异可能会使这个时间戳不可靠。此外,一个大事务可能比一个小事务花费更多的时间,因此一个小事务可能比一个大事务完成得更早,时间戳也更晚。如果这意味着这是一个超级可靠的机制,你可能应该看看Sql Server审计