问题 EF Code First:我在哪里可以找到SavingChanges事件?


好吧,这可能是一个新手问题,但我如何/在哪里可以订阅ObjectContext.SavingChanges事件,例如在此提到 岗位

我的演示应用程序中只有两个相关的类:“Country”类和一个包含EF Code First“定义”的类:

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

任何提示都受到高度赞赏。


1079
2017-10-22 18:28


起源



答案:


你应该能够做到这一点:

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; }  
}  

10
2017-10-22 19:01



不完全理解你的语法,但校长对我来说似乎是最好的方法。真正的问题是,如果使用EF 4.1有更好的方法。 - Sander Rijken
@SanderRijken - 你不懂什么语法?这很直接。 DbContext实现了 IObjectContextAdapter 接口,它有一个名为ObjectContext的属性。你投了 this 到适配器,然后使用它的ObjectContext属性来设置事件。 - Erik Funkenbusch
(event evt)。我可能会把事件曝光为 public event EventHandler<SomeEventArgsType> SavingChanges { add { ((IObjectContextAdapter)this).ObjectContext.SavingChanges += value; } remove { ((IObjectContextAdapater)this).ObjectContext.SavingChanges -= value; } } - Sander Rijken
@SanderRijken - 这也是一种可能,它可以通过多种方式完成。这一切都取决于你的偏好。但是,您确实应该在add方法中删除并添加事件,因此事件不会被添加两次。 - Erik Funkenbusch
@MystereMan可以安全地在TestDb的构造函数中调用这个“SetSavingChanges”方法吗? - Stephen Holt


答案:


你应该能够做到这一点:

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; }  
}  

10
2017-10-22 19:01



不完全理解你的语法,但校长对我来说似乎是最好的方法。真正的问题是,如果使用EF 4.1有更好的方法。 - Sander Rijken
@SanderRijken - 你不懂什么语法?这很直接。 DbContext实现了 IObjectContextAdapter 接口,它有一个名为ObjectContext的属性。你投了 this 到适配器,然后使用它的ObjectContext属性来设置事件。 - Erik Funkenbusch
(event evt)。我可能会把事件曝光为 public event EventHandler<SomeEventArgsType> SavingChanges { add { ((IObjectContextAdapter)this).ObjectContext.SavingChanges += value; } remove { ((IObjectContextAdapater)this).ObjectContext.SavingChanges -= value; } } - Sander Rijken
@SanderRijken - 这也是一种可能,它可以通过多种方式完成。这一切都取决于你的偏好。但是,您确实应该在add方法中删除并添加事件,因此事件不会被添加两次。 - Erik Funkenbusch
@MystereMan可以安全地在TestDb的构造函数中调用这个“SetSavingChanges”方法吗? - Stephen Holt


从我在MSDN上看到的, DbContext 包装一个实例 ObjectContext 作为一个门面,不暴露这个特定的事件。

然而, DbContext 确实有 构造函数重载 需要一个 ObjectContext  - 你可以使用它来传递 ObjectContext 并订阅 SavingChanges 事件就可以了。

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

  }
}

2
2017-10-22 18:58





另一种方式可能是,例如:

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

0
2018-06-04 14:14