我正在使用EF进行一些测试,我试图在ObjectContext.SavingChanges上获取一个钩子。当我在上下文中将对象直接添加到它们的集合时,一切都有效。但是当我通过Entity nav属性添加它们时,它们不会出现在事件中。
我将展示一个让它更清晰的例子。 这是在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; }
}
答案 0 :(得分:0)
好的,问题在于缺乏变更跟踪。我试图使用代理来做到这一点,但事实证明“新”运算符不会创建任何类型的代理,因此不会对对象进行跟踪,并且不会向上下文添加任何内容。
要创建代理,我需要调用ObjectContext.CreateObject。考虑到我正在使用DbContext,解决方案是公开内部ObjectContext或创建一个在内部调用上下文的方法。我选择了后者。
但这似乎是一个黑客。您对更优雅的解决方案有什么建议吗?
编辑:虽然这有效但可以坚持使用DbContext API。这是通过使用非代理POCO并在引发SavingChanges事件之前调用DetectChanges来完成的。