2010-09-13 161 views
1

我正在做一些與EF測試,我試圖得到一個ObjectContext.SavingChanges鉤。當我將對象直接添加到上下文中的設置時,一切都正常。但是,當我通過實體導航屬性添加它們時,它們不會顯示在事件中。實體框架SaveChanges問題

我會舉個例子來說明一下。 這是在SavingChanges事件中註冊的方法。

void SavingChanges(object sender, System.EventArgs e) 
{ var oc = (ObjectContext)sender; 
    foreach (var entity in oc.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Unchanged | EntityState.Modified)) 
     Debug.WriteLine(entity); 

} 

這就是我如何添加東西的上下文。

var w1 = new Workspace() 
      { 
       Name = "teste1", 
      }; 

var w2 = new Workspace() 
      { 
       Name = "teste2" 
      }; 

var w3 = new Workspace() 
      { 
       Name = "teste3" 
      }; 

var w4 = new Workspace() 
      { 
       Name = "teste4" 
      }; 

//this shows up in the event 
context.Workspaces.Add(w1); 

//these do NOT show up on the event 
w1.Children.Add(w2); 
w1.Children.Add(w3); 
w1.Children.Add(w4); 

context.SaveChanges(); 

有沒有一種方法可以讓我調用SaveChanges時添加的所有實體?他們正在我的數據庫中堅持,所以我想知道它何時發生。

謝謝!

編輯:我使用EF4與CTP4。

edit2:這是我的POCO。

public class Workspace 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 

    public virtual ICollection<Workspace> Children{ get;set;} 

    public virtual Workspace Parent { get; set; } 
} 
+2

我試過了,它會返回包括Children集合中的所有對象。你使用哪個EF版本? – 2010-09-13 18:39:05

+0

我已經使用該信息編輯了該問題。 – codegarten 2010-09-13 21:43:41

+0

你在使用STE嗎? – 2010-09-14 02:25:32

回答

0

好的,所以問題是缺乏變化跟蹤。我試圖使用代理來做到這一點,但事實證明'新'操作符不會創建任何類型的代理,因此不會跟蹤對象,也不會向其添加任何內容。

要創建一個代理我需要調用ObjectContext.CreateObject。考慮到我在使用DbContext,解決方案是要麼公開內部的ObjectContext,要麼創建一個可以在內部調用上下文的方法。我去了後者。

但是,這似乎是一個破解。你對更優雅的解決方案有任何建議嗎?

編輯:雖然這可行,但只能堅持DbContext API。這是通過使用非代理POCO並在引發SavingChanges事件之前調用DetectChanges來完成的。