Yvision.kzYvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
-4
22:37, 23 августа 2010

System.Data.OptimisticConcurrencyException

System.Data.OptimisticConcurrencyException (Инструкции по обновлению, вставке или удалению из хранилища затронули непредвиденное число строк (0). Сущности могли быть изменены или удалены с момента их загрузки. Обновите записи диспетчера ObjectStateManager.).

Такое исключение выбрасывается при попытке изменения полей строк в базе данных, которая построена на ADO.NET Entity Framework и System.Data.SQLite. Эту проблему я описывал в посте "ADO.NET Entity Framework и System.Data.SQLite - попытка глубокого прогружения".

Проблема решилась! Тип данных полей. В документации по SQLite написано:

...The following table shows how many common datatype names from more traditional SQL implementations are converted into affinities by the five rules of the previous section...

Datatypes In SQLite Version 3 - 2.2 Affinity Name Examples

Потрясающий факт в том, что движок SQLite при создании таблиц, принимал любые типы данных (uniqueidentifier, bit, smallint, tinyint и т.п.). Мало того, он не краснея, выдавал такие типы при запросе. Зато при вставке, обновлении или удалении данных слал в сад, при этом ругался не он сам, а почему-то, ни в чем не повинный ObjectStateManager из сборки System.Data.Entity.

Короче, System.Data.SQLite, ни хрена ничего сам не преобразовывает. Нужно преобразовать все типы вручную по правилам Datatypes In SQLite Version 3 - 2.2 Affinity Name Examples (см. таблицу) и можно наслаждаться Entity Framework`ом.

-4
1655
0