EF Code First: Где я могу найти событие SavingChanges?

ОК, это может быть вопрос новичков, но как/где я могу подписаться на событие ObjectContext.SavingChanges, как упомянуто, например, в этом сообщении .

В моем демонстрационном приложении есть только два соответствующих класса: класс "Страна" и класс, который содержит "определения" EF Code:

internal class TestDb : DbContext
{
    public DbSet<Country> Countries { get; set; }       
}

Любые намеки приветствуются.

Ответ 1

Вы должны иметь возможность сделать это:

internal class TestDb : DbContext  
{  
    public void SetSavingChanges(EventHandler evt) 
    {
            var oc = this as IObjectContextAdapter;
            oc.ObjectContext.SavingChanges -= evt;
            oc.ObjectContext.SavingChanges += evt;
    }

    public DbSet<Country> Countries { get; set; }  
}  

Ответ 2

Из того, что я могу видеть в MSDN, DbContext завершает экземпляр ObjectContext как фасад, не подвергая этому конкретному событию.

Однако DbContext имеет конструктор перегрузки, который принимает ObjectContext - вы можете использовать это для передачи в ObjectContext и подписаться на событие SavingChanges на нем.

using(ObjectContext context = new ObjectContext(myConnectionString))
{
  using(DbContext dbContext = new DbContext(context, true))
  {

  }
}

Ответ 3

Другой способ может быть, например:

Public Class MainForm

  Private WithEvents myObjectContext As ObjectContext
  Private myDbContext As DbContext

...

  Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles Me.Load
    myDbContext = New DbContext
    myObjectContext = CType(myDbContext, IObjectContextAdapter).ObjectContext

...


  Private Sub ObjectContextSavingChanges(sender As Object, e As EventArgs) Handles myObjectContext.SavingChanges

    'Your code hear

  End Sub