有没有办法强制上下文在SaveChanges事件期间完成SaveChanges?

时间:2015-04-30 06:41:10

标签: c# entity-framework events

所以我要做的是一个事件源,它侦听SaveChanges事件的给定上下文,然后获取所有更改的条目并推出这些条目的已更改属性。

E.g。

public class ContextChangeListener {
    public event EventHandler<ContextChangeEvent> ContextChanges;

    private ObjectContext _context;

    public ContextChangeListener(ObjectContext context) {
        _context = context;
        _context.SavingChanges += OnSavingChanges;
    }

    protected virtual void OnSavingChanges(object source, EventArgs evt) {
        var handler = ContextChanges;

        if (handler == null) {
            return;
        }

        var changedEntries = 
            _context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Deleted | EntityState.Modified);

        foreach (var changedEntry in changedEntries) {
            handler.Invoke(this, new ContextChangeEvent(changedEntry));
        }
    }
}

我现在想知道的是,我说我得到的状态已添加。可能存在他们的PK尚未生成的情况。是否可以侦听保存更改后发送的事件。

  1. 发生SavingChanges事件;将所有更改的条目添加到集合中并等待&#34; ChangesCommited&#34;事件
  2. &#34; ChangesCommited&#34;事件发生;发出ContextChangeEvent。
  3. 如果这不可能,那么是否可以强制EF从OnSavingChanges方法提交更改?

1 个答案:

答案 0 :(得分:1)

您可以从ObjectContext继承并实现IObjectContext,然后包装SaveChanges方法:

public class MyContext : ObjectContext, IObjectContext
    {
        public event EventHandler ContextSaved;

        public void SaveChanges()
        {
            base.SaveChanges();
            if (ContextSaved != null)
                ContextSaved.Invoke(this, null);
        }

        public void Dispose()
        {
            base.Dispose();
        }

        public IRepository<T> GetRepository<T>() where T : class
        {
            throw new NotImplementedException();
        }
    }