Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/17: Рейтинг темы: голосов - 17, средняя оценка - 4.59
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
1

Entity framework - пропадают изменения в базе данных в случае сбоя программы

05.10.2015, 11:01. Показов 3299. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые Гуру!
В WPF проекте используется entity framework (база данных mysql).
Операторы производят изменения в базе данных, выполняя периодически сохранение изменений
C#
1
context.SaveChanges();
Если происходит аварийное завершение программы, то после перезапуска программы - произведенные
изменения не наблюдаются. Первое что в голову приходит -
1. либо данные кэшируются и при сбое данные из кэша не сбрасываются в базу
Т.е. если произвести изменения и программа завершается без сбоев, то при загрузке видно , что изменения
сохраняются нормально, а в случае сбоя - нет.
В чем может быть дело?

Добавлено через 1 час 9 минут
Провожу эксперименты чтобы понять в чем дело.
1. Сделал изменение , сохранил , посмотрел непосредственно в базе данных - изменения прошло.
2. Во втором поле попробовал сохранить строку длины большей , чем длина текстового поля . Произошло аварийное завершение программы, но первое изменение сохранилось.

Проблема в том, что в последние 2 дня вводилось много данных. Было пару случаем когда после двух - трех часов работы происходил сбой и "пропадали" все изменения, т.е. результат многочасовой работы.

Добавлено через 47 минут
1. Возможно ли что уже сохраненные в базе данных изменения откатываются назад? Как это исключить?
2. Возможно ли что данные при каких-то обстоятельствах кэшируются и сохраняются только при нормальном завершении программы и не сохраняются - в противном случае? Как это избежать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2015, 11:01
Ответы с готовыми решениями:

Как определить в Entity Framework, что модель не соответствует подключенной базе данных
Создал модель на основе базы данных. На сервере имеются несколько идентичных ей. Пользователь имеет...

Entity Framework, не работает подключение к существующей базе
Здравствуйте! Начал изучать EF по следующим урокам: http://metanit.com/sharp/entityframework/ ...

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

[Entity Framework] Как реализовать проверку того, есть ли уже проверяемая новость в базе?
Доброго времени суток! Я делаю парсер, который получает данные из раздела новостей сайта...

8
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
06.10.2015, 11:54 2
Цитата Сообщение от АТерентьев Посмотреть сообщение
Операторы производят изменения в базе данных, выполняя периодически сохранение изменений
Каким образом периодически выполняется сохранение? Жмут на кнопку "сохранить"?

Цитата Сообщение от АТерентьев Посмотреть сообщение
если произвести изменения и программа завершается без сбоев, то при загрузке видно , что изменения
сохраняются нормально, а в случае сбоя - нет.
В чем может быть дело?
Если сохранения производятся по запросу пользователя, то при сбое любые изменения с последнего вызова SaveChanges пропадут.

Цитата Сообщение от АТерентьев Посмотреть сообщение
1. Возможно ли что уже сохраненные в базе данных изменения откатываются назад? Как это исключить?
Возможно, если используются транзакции.
Попробуйте сделать поиск по коду по запросу "BeginTransaction".

Цитата Сообщение от АТерентьев Посмотреть сообщение
2. Возможно ли что данные при каких-то обстоятельствах кэшируются и сохраняются только при нормальном завершении программы и не сохраняются - в противном случае? Как это избежать?
Если не используются транзакции, то каждый вызов SaveChanges генерирует запрос(ы) к базе, так что если сам вызов не закрашился, то изменения будут сохранены.

Цитата Сообщение от АТерентьев Посмотреть сообщение
Проблема в том, что в последние 2 дня вводилось много данных. Было пару случаем когда после двух - трех часов работы происходил сбой и "пропадали" все изменения, т.е. результат многочасовой работы.
Поспрашивайте пользователей, может они тупо сохраняться забывали.
А еще лучше, добавьте в код нормальное логирование, а то пользователи могут и сбрехнуть.
1
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
06.10.2015, 21:46  [ТС] 3
Пришлось временно обойти проблему. Но в ближайшее время придется разбираться. Программа написана мной и эксплуатируется уже лет 5. Я напрямую транзакций не использовал - context.saveChanges() и все. Практически после каждого изменения записи операторы нажимают кнопку "Сохранить". Это было и в моем присутствии. После сбоя - перезагружаем программу (благо занимает это доли секунды) - изменения в базе не сохранились. Какого-то разумного объяснения этому явлению пока не вижу. Если закрыть программу до того как появится исключение - все результаты сохраняются.
Параллельно с работой программы запускал dbForge studio и смотрел записываются ли изменения в базу после нажатия "Сохранить" - записываются.
Пока не определил причину сбоя, который приводит к потере данных - казалось это не сложно, но - не получается. Вообщем пока так. Спецы из microsoft просят побольше информации ...
0
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
06.10.2015, 22:07 4
Попробуй профайлер использовать, какие запросы в бд идут посмотри
1
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
06.10.2015, 23:26 5
Цитата Сообщение от АТерентьев Посмотреть сообщение
После сбоя - перезагружаем программу (благо занимает это доли секунды) - изменения в базе не сохранились.
Думаю, в этом случае стоит начать с самого сбоя: что за сбой, почему происходит, при каких обстоятельствах, каково состояние программы на этот момент?

Так же добавьте в контекст логирование (context.Database.Configuration.Log = ...), чтобы видеть, генерируются ли запросы. Если вы не создаете новый контекст под каждое изменение, то, возможно, происходит какой-то сбой в отслеживании изменений и записи просто не определяются как измененные, следовательно запись в базу не производится. Наличие или отсутствие запросов к базе это выявит.
1
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
07.10.2015, 08:53  [ТС] 6
Со всеми замечаниями согласен. Все попробую.
0
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
15.10.2015, 16:44  [ТС] 7
Проблема в том, что сложно повторить ситуацию, она возникает спонтанно. Возникает она в подчиненных записях, раньше этого не было. Мне видится сейчас несколько причин.

1. Или ошибка в программе, которая раньше не проявлялась так часто,
2. или индекс сбился и нужно найти в чем дело и исправить
3. Иногда такие плавающие сбои связаны с утечкой и , соответственно, недостатком памяти. Иногда ошибка возникает (или ее обнаруживают ) через 2-3 часа работы

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

Посмотрю возможно ли обеспечить гарантированный способ записи данных. Например, перед сохранением определить модифицированные записи и перезаписать их в новом контексте. Как временный вариант , конечно, пока не найду ошибку.
0
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
16.10.2015, 17:09  [ТС] 8
Добавил логирование :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
        private void LogHistory()
        {
 
            var entries = dc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).ToList();  //EntityState.Added | EntityState.Deleted | 
 
            foreach (var entry in entries)
            {
                System.Data.EntityKey key = entry.EntityKey;
                string primaryKeyName = key.EntityKeyValues[0].Key.ToString();
                string keyValue = key.EntityKeyValues[0].Value.ToString();
                string setName = entry.EntitySet.Name;
 
                string logItem = "setName:" + entry.EntitySet.Name+';';
                logItem += primaryKeyName + ':'+keyValue+';';
                if (setName != "paramvalues")
                    notParamvaluewSet = setName;
 
 
                #region 
                foreach (string o in entry.GetModifiedProperties())
                {               
                    var currentVal  = (entry.CurrentValues[o] ?? string.Empty).ToString();
                    var originalVal = (entry.OriginalValues[o] ?? string.Empty).ToString();
                    logItem += o.Trim() + ':' + currentVal + ':' + originalVal+';';
 
                   // MessageBox.Show("Свойство "+ parm.name +" было - " + originalVal + "  стало - "+ currentVal + " объект - "+ об.наименование);
 
                }
                #endregion
 
                #region write log record
                dblog log = new dblog();
 
                log.loglevel = 0;
                log.operation = "upd";
                log.timestamp = DateTime.Now;
 
                log.logitem = logItem;
                log.userName = GlobalVar.USERNAME;
                log.computer = GlobalVar.CLIENTNAME;
 
                dc.AddObject("dblogs", log);
                logList.Add(log);
                #endregion
            }
        }
Вызываю эту процедуру перед SaveChanges(), а после сохранения dc.refresh и проверяю - все ли сохранилось. Если нет повторяю запись. На рисунке - вверху основная таблица с объектами, внизу - дополнительные параметры для каждого объекта сверху. Если для каждого из трех объектов изменить какой-нибудь параметр, то в entries - только одна запись для последнего объекта. Я ожидал, что будет для всех трех. Видимо при переходе на следующий объект - происходит запись в базу. При этом все изменения записываются нормально (изменения пропадают , но редко) .
Видел, что после внесения изменений делали отчет - в нем все изменения отражаются, а после перезагрузки - пропадают.
0
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
16.10.2015, 17:11  [ТС] 9
Рисунок
Миниатюры
Entity framework - пропадают изменения в базе данных в случае сбоя программы  
0
16.10.2015, 17:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2015, 17:11
Помогаю со студенческими работами здесь

Обновление данных в Entity Framework
Всем привет, помогите пожалуйста. вот есть такой код testentityEntities creat = new...

Автообновление данных с Entity Framework
В составе C# и MSSQL пишу многопользовательскую программу (по сути простой учёт продукции на...

Entity Framework другие источники данных
Какие базы данных можно использовать в Entity Framework, меня интересует Excel запись и чтение...

Entity Framework и загрузка данных в БД SQL CE
Доброго времени суток! Использую Entity Framework Code First и бд SQL CE 4.0. Пытаюсь прочитать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru