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 
相關問題