Проблема сохранения изменений Entity Framework

Я провожу некоторое тестирование с 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; }
}

person codegarten    schedule 13.09.2010    source источник
comment
Я пробовал, и он возвращает все объекты, в том числе из коллекции Children. Какую версию EF вы используете?   -  person Morteza Manavi    schedule 13.09.2010
comment
Я отредактировал вопрос с этой информацией.   -  person codegarten    schedule 14.09.2010
comment
Я следовал инструкциям по использованию прокси-трекинга, но не думаю, что это работает. Кроме того, если я вызову DetectChanges для ObjectContext, я получу все добавленные объекты.   -  person codegarten    schedule 14.09.2010
comment
При использовании прокси отслеживание изменений работает только в том случае, если свойства public virtual — вы не показываете свои типы, поэтому я не могу сказать, делали ли вы это. То, что это работает, когда вы вызываете DetectChanges, предполагает, что у вас может и не быть.   -  person Craig Stuntz    schedule 14.09.2010
comment
Но я сделал. Оператор «новый» не создает прокси, поэтому мне нужно получить доступ к моему DbContext.ObjectContext.CreateObject‹T›(), чтобы получить его.   -  person codegarten    schedule 14.09.2010
comment
Да это правильно. new POCO не может создать прокси.   -  person Craig Stuntz    schedule 14.09.2010


Ответы (1)


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

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

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

Изменить: хотя это работает, можно придерживаться только API DbContext. Это делается с помощью POCO без прокси-сервера и вызова DetectChanges до возникновения события SavingChanges.

person codegarten    schedule 14.09.2010