1

我正在用 EF 做一些测试,我试图在 ObjectContext.SavingChanges 上获得一个钩子。当我将对象直接添加到上下文中的集合时,一切正常。但是当我通过实体导航属性添加它们时,它们不会出现在事件中。

我将展示一个示例以使其更清楚。这是在 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; }
}
4

1 回答 1

0

好的,所以问题在于缺乏更改跟踪。我试图使用代理来做到这一点,但事实证明“新”运算符不会创建任何类型的代理,因此不会对对象进行跟踪,也不会将任何添加到它们的内容添加到上下文中。

要创建代理,我需要调用 ObjectContext.CreateObject。考虑到我使用的是 DbContext,解决方案要么公开内部 ObjectContext,要么创建一个在内部调用上下文的方法。我选择了后者。

但这似乎是一个黑客行为。您对更优雅的解决方案有什么建议吗?

编辑:虽然这可行,但可以仅坚持使用 DbContext API。这是通过使用非代理 POCO 并在引发 SavingChanges 事件之前调用 DetectChanges 来完成的。

于 2010-09-14T22:52:50.770 回答