Entity Framework проблема SaveChanges - PullRequest
       9

Entity Framework проблема SaveChanges

1 голос
/ 13 сентября 2010

Я провожу некоторое тестирование с 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?Они сохраняются в моей базе данных, поэтому я хочу знать, когда это произойдет.

Спасибо!

edit: я использую 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; }
}

1 Ответ

0 голосов
/ 15 сентября 2010

Хорошо, поэтому проблема заключалась в отсутствии отслеживания изменений.Я пытался использовать прокси, чтобы сделать это, но оказалось, что оператор 'new' не создает никаких прокси-серверов, поэтому отслеживание объектов не производится и в контекст ничего не добавляется.1002 * Для создания прокси мне нужно было вызвать ObjectContext.CreateObject.Учитывая, что я использовал DbContext, решения должны были либо раскрыть внутренний ObjectContext, либо создать метод, который вызывал бы контекст внутри.Я пошел за последним.

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

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

...