Исключение оптимистичного параллелизма было обработано кодом пользователя
Я использую MVC4 с Entity Framework 4.1.
Изначально мы создали модель сущности Ado.net из базы данных. В файле.edmx некоторые таблицы в базе данных не видны, так как не имеют первичного ключа в конкретной таблице.
Поскольку наш проект движется вперед, нам необходимо обновить одну из таблиц журналов, которые не имеют поля первичного ключа.
Итак, мы изменили наш файл.edmx вместо того, чтобы вносить изменения в базу данных. наш клиент попросил нас не изменять поля базы данных. мы изменили.edmx и создали pk на одном из существующих полей в таблице (скажем, tbl_log
Таблица).
мы пытаемся обновить tbl_log. Но это дает сообщение об ошибке как Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
Я видел много вопросов о переполнении стека, а также немного погуглил, но не смог найти никакого решения.
Даже я пытался обновить записи ObjectStateManager, но это все еще указывает на ту же ошибку.
Вот мой код
tbl_log log = new tbl_log();
Entity.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified);
log.LoginId = strLoginId;
log.Password = strPassword;
log.IPAddress = strIpAddress;
log.Date_Time = DateTime.Parse(DateTime.Now.ToString());
log.sessionId = new Guid(strSessionId);
Entity.AddTotbl_log(log);
Entity.SaveChanges();// optimistic concurrency error
Пожалуйста помоги
Спасибо,
Картик
1 ответ
Ваша модель должна представлять схему базы данных. Если вы добавите PK в модель, он также должен существовать в базе данных, в противном случае вы получите ошибки. Обычно плохая практика - не иметь PK ни в одной таблице, даже если эта таблица является таблицей журнала аудита.
Исключением является то, что средство отслеживания объектов не может определить, изменилось ли состояние объекта с момента последнего обращения к базе данных. Это связано с тем, что установленный PK по-прежнему равен 0 даже после того, как платформа отправила запрос на вставку / обновление.
К сожалению, нет хорошего способа обойти это. Я бы предложил (как я думаю, Microsoft) добавить столбец первичного ключа для каждой таблицы в вашей базе данных.
РЕДАКТИРОВАТЬ - Из комментариев
Так как PK используется для отслеживания объекта, если в вашей модели для PK установлен StoreGenerationPattern of Identity, он будет ожидать изменения значения. Когда он не изменится, он выдаст ошибку, которую вы видите. Попробуйте изменить StoreGenerationPattern на None, так как тогда EF не будет ожидать, что ваш faux-PK изменится