2010-09-13 4 views
1

Я выполняю некоторые тесты с помощью EF, и я пытался получить привязку к ObjectContext.SavingChanges. Все работает, когда я добавляю объекты непосредственно к их набору в контексте. Но когда я добавляю их через свойство Entity nav, они не отображаются в событии.Проблема Entity Framework 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 вы используете? –

+0

Я отредактировал вопрос с этой информацией. – codegarten

+0

Вы используете STE? –

ответ

0

Хорошо, проблема была в отсутствии отслеживания изменений. Я пытался использовать прокси-серверы для этого, но, оказывается, «новый» оператор не создает никакого прокси-сервера, поэтому для объектов не добавляется отслеживание, и ничего не добавляется к ним.

Чтобы создать прокси-сервер, мне нужно было вызвать ObjectContext.CreateObject. Учитывая, что я использовал DbContext, решения заключались в том, чтобы либо открыть внутренний ObjectContext, либо создать метод, который будет вызывать контекст внутри. Я пошел за последним.

Но это кажется взломом. Есть ли у вас предложения для более элегантного решения?

Редактировать: Хотя это работает, можно придерживаться только API DbContext. Это делается с помощью не-proxy POCOs и вызова DetectChanges до того, как событие SavingChanges будет поднято.