10

好的,这可能是一个新手问题,但我如何/在哪里可以订阅ObjectContext.SavingChanges事件,如本例中提到的postEF Code First:我在哪里可以找到SavingChanges事件?

我只有两个我的演示应用程序相关的类:“国家”级和保持EF代码优先“定义”一类:

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

任何暗示的高度赞赏。

回答

10

你应该能够做到这一点:

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

不完全理解你的语法,但主要恍如最好的方式给我。真正的问题是如果使用EF 4.1还有更好的方法。 –

+0

@SanderRijken - 你不懂什么语法?这非常简单。 DbContext实现了'IObjectContextAdapter'接口,它有一个名为ObjectContext的属性。您将'this'投射到适配器,然后使用它的ObjectContext属性来设置事件。 –

+1

'(event evt)'。我可能会暴露事件为公共事件EventHandler SavingChanges {add {((IObjectContextAdapter)this).ObjectContext.SavingChanges + = value; }删除{((IObjectContextAdapater)this).ObjectContext.SavingChanges - = value; }}' –

2

从我在MSDN上可以看到的,DbContextObjectContext的一个实例包装为外观,而不公开此特定事件。

然而,DbContext确实有constructor overload接受一个ObjectContext - 你可以用它来在ObjectContext传递和订阅就可以了SavingChanges事件。

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

    } 
} 
0

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

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 
相关问题