25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
|
||||||
1 | ||||||
Entity framework - пропадают изменения в базе данных в случае сбоя программы05.10.2015, 11:01. Показов 3299. Ответов 8
Метки нет (Все метки)
Уважаемые Гуру!
В WPF проекте используется entity framework (база данных mysql). Операторы производят изменения в базе данных, выполняя периодически сохранение изменений
изменения не наблюдаются. Первое что в голову приходит - 1. либо данные кэшируются и при сбое данные из кэша не сбрасываются в базу Т.е. если произвести изменения и программа завершается без сбоев, то при загрузке видно , что изменения сохраняются нормально, а в случае сбоя - нет. В чем может быть дело? Добавлено через 1 час 9 минут Провожу эксперименты чтобы понять в чем дело. 1. Сделал изменение , сохранил , посмотрел непосредственно в базе данных - изменения прошло. 2. Во втором поле попробовал сохранить строку длины большей , чем длина текстового поля . Произошло аварийное завершение программы, но первое изменение сохранилось. Проблема в том, что в последние 2 дня вводилось много данных. Было пару случаем когда после двух - трех часов работы происходил сбой и "пропадали" все изменения, т.е. результат многочасовой работы. Добавлено через 47 минут 1. Возможно ли что уже сохраненные в базе данных изменения откатываются назад? Как это исключить? 2. Возможно ли что данные при каких-то обстоятельствах кэшируются и сохраняются только при нормальном завершении программы и не сохраняются - в противном случае? Как это избежать?
0
|
05.10.2015, 11:01 | |
Ответы с готовыми решениями:
8
Как определить в Entity Framework, что модель не соответствует подключенной базе данных Entity Framework, не работает подключение к существующей базе В чем разница между Entity Framework и Entity Framework Core? [Entity Framework] Как реализовать проверку того, есть ли уже проверяемая новость в базе? |
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
06.10.2015, 11:54 | 2 |
Каким образом периодически выполняется сохранение? Жмут на кнопку "сохранить"?
Если сохранения производятся по запросу пользователя, то при сбое любые изменения с последнего вызова SaveChanges пропадут. Возможно, если используются транзакции. Попробуйте сделать поиск по коду по запросу "BeginTransaction". Если не используются транзакции, то каждый вызов SaveChanges генерирует запрос(ы) к базе, так что если сам вызов не закрашился, то изменения будут сохранены. Поспрашивайте пользователей, может они тупо сохраняться забывали. А еще лучше, добавьте в код нормальное логирование, а то пользователи могут и сбрехнуть.
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
|
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 | |||||
Добавил логирование :
Видел, что после внесения изменений делали отчет - в нем все изменения отражаются, а после перезагрузки - пропадают.
0
|
25 / 24 / 18
Регистрация: 16.10.2009
Сообщений: 1,156
|
|
16.10.2015, 17:11 [ТС] | 9 |
Рисунок
0
|
16.10.2015, 17:11 | |
16.10.2015, 17:11 | |
Помогаю со студенческими работами здесь
9
Обновление данных в Entity Framework Автообновление данных с Entity Framework Entity Framework другие источники данных Entity Framework и загрузка данных в БД SQL CE Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |