2010-09-13 162 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来完成的。