Имеет ли смысл создавать новый объект в Entity Framework перед его сохранением для решения проблем с несколькими контекстами? - PullRequest
0 голосов
/ 01 февраля 2012

Имеет ли смысл создавать новый объект перед попыткой сохранить объект, который я уже загрузил, но с несколькими контекстами?

После множества попыток и ошибок этот код работает нормально.По сути, это получение значений для Konsultanci и Szkolenie с текущим контекстом, основанным на объектах, которые считываются из ObjectListView.

        var listaDoPodmiany = new List<SzkolenieUczestnicy>();
        if (listaUczestnikow.GetItemCount() > 0) {
            foreach (SzkolenieUczestnicy currentUczestnik in listaUczestnikow.Objects) {
                using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
                    if (currentUczestnik.SzkolenieUczestnicyID == 0) {
                        var nowy = new SzkolenieUczestnicy {
                            Konsultanci = context.Konsultancis.First(p => p.KonsultantNazwa == currentUczestnik.Konsultanci.KonsultantNazwa),
                            Szkolenie = context.Szkolenies.First(p => p.SzkolenieID == varSzkolenie.SzkolenieID),
                            SzkolenieUzytkownik = currentUczestnik.SzkolenieUzytkownik,
                            SzkolenieUzytkownikData = currentUczestnik.SzkolenieUzytkownikData,
                            UczestnikPotwierdzilUdzial = currentUczestnik.UczestnikPotwierdzilUdzial,
                            UczestnikPrzybyl = currentUczestnik.UczestnikPrzybyl
                        };


                        context.SzkolenieUczestnicies.AddObject(nowy);
                        context.SaveChanges();
                        listaDoPodmiany.Add(nowy);
                    } else {


                        context.SzkolenieUczestnicies.Attach(currentUczestnik);
                        context.ObjectStateManager.ChangeObjectState(currentUczestnik, EntityState.Modified);
                        context.SaveChanges();
                        listaDoPodmiany.Add(currentUczestnik);
                    }
                }
            }
            listaUczestnikow.ClearObjects();
            listaUczestnikow.SetObjects(listaDoPodmiany);
        }

Кажется, это решает множество проблем, возникающих у меня в разных контекстах.Но это хороший подход?Будет ли это сильно влиять на скорость, так как я думаю, что Konsultanci и Szkolenie будут прочитаны в другой раз из SQL?

Это продолжение (или, скорее, вывод из нескольких вопросов, которые я задавал ранее):

1 Ответ

4 голосов
/ 01 февраля 2012

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

Нет. Но это показывает , что у вас есть проблема с дизайном в вашем приложении. Вам не нужно иметь дело с несколькими контекстами для одних и тех же объектов .

Я думаю, у вас есть проблемы с продолжительностью жизни ваших контекстов. Эту проблему решить нелегко, но вот статья , которая может вам помочь. Смотри также здесь .

Мое мнение таково, что контексты должны иметь максимально короткое время жизни. Долгосрочные контексты, как правило, являются плохой практикой , так как вы быстро столкнетесь с проблемами в вашем приложении (утечка памяти, проблемы при работе с многопоточностью или параллелизмом ... и т. Д.)

Если у вас 3-уровневая архитектура, вам действительно нужно предоставить сервисы без сохранения состояния и создать новый контекст для запроса . Если вы обращаетесь к базе данных напрямую из вашего приложения (двухуровневого приложения), например, приложения Winform, которое напрямую запрашивает БД, максимально сократит время жизни вашего контекста , если вы не можете делать запросы без сохранения состояния.

Последнее слово: создание новых контекстов требует очень небольших затрат и не приводит к проблемам с производительностью в 99% случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...