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

时间:2014-06-23 20:33:01

标签: c# entity-framework

我在实体框架中进行数据库首次建模,为简单起见,我只想说我有两个相关的表

我的实体类是

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属性以反映单个tstamp 1}}在SaveChanges被调用的那一刻设置的值...是否有一种简单的方法可以做到这一点?

所以让我们说在JournalEntryCode db上下文中我有两条记录,其中journal_entry_code_pk为2,另一条journal_entry_code_pk为5,它们都在{{1}上被修改}属性

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

tstamp

我无法弄清楚如何修改上下文中记录的DateTime tstamp = DateTime.UtcNow; 属性的当前状态值。

1 个答案:

答案 0 :(得分:0)

最简单的方法是定义类似

的界面
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审计。