Преобразование представления в таблицы и сохранение изменений дает мне оптимистическое исключение параллелизма
-
12-12-2019 - |
Вопрос
Я работаю с Entity Framework 4 (используя объекты с самоотслеживанием) и получаю доступ к представлению, которое представляет собой объединение двух таблиц.Поэтому, когда я обновляю информацию о представлении, я отправляю STE представления в репозиторий, который имеет доступ к базе данных.
Я сделал следующее:
Когда я получаю представление с обновленной информацией, я создаю свои STE1 и STE2.Как, когда я создаю STE, он создается с добавленным состоянием.Итак, как я узнаю, что состояние STE представления изменено, я меняю состояние двух моих STE с помощью метода MarkedAsModified
.
Затем, имея в STE представления информацию из двух таблиц, я передаю информацию из представления в правильный STE и применяю изменения из STE к objectContext
.
Наконец я делаю saveChanges
.Но на этом этапе я получаю Optimistic concurrency exception
.Я думаю, что это потому, что ЕНТО перешло от государства к Added
к Modified
поэтому контекст обнаруживает, что между созданием и созданием есть некоторая модификация. SaveChanges
, но также я стараюсь AcceptChanges
в STE, позже помеченном как измененный, применить изменения и, наконец, SaveChanges
, но проблема сохраняется.
Как я могу решить проблему?есть ли лучший способ работы с представлением и Entity Framework v4?
Спасибо.Даймрок.
РЕДАКТИРОВАТЬ 1:У меня все еще есть проблемы.Мой код следующий:
Компоненты myComponent = новые компоненты();// это Ste -myComponent.REREFENCER = myView.Reference;...// другие свойства mycomponent.markedasmodified ();//это необходимо, потому что я хочу обновить информацию, а не добавлять новый регистр.myContext.ApplyChanges("Компоненты", myComponent);miContexto.SaveChanges();
В saveChanges я получаю исключение:Оператор обновления, вставки или удаления затронул неожиданное количество строк (0).Сущности могли быть изменены или удалены с момента их загрузки.Обновите записи ObjectStateManager.
В чем проблема?могу ли я не модифицировать новый созданный STE?
Спасибо.
Решение
Я нашел способ решить проблему.
В первом решении решение заключалось в том, чтобы сделать запрос к базе данных, чтобы получить существующие регистры в базе данных.Это добавит объекты в контекст, после чего можно будет изменить данные и правильно сохранить изменения.
Но позже я нашел способ избежать необходимости делать запрос к базе данных для добавления измененных объектов в контекст.
Способ использует следующий код:
Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);
//update the data of the entity.
myContext.SaveChanges();
Решение состоит в том, чтобы создать новую сущность, установив первичный ключ.Если бы у организации был FK, это было бы указано таким же образом.На этом этапе у сущности есть добавленное состояние.
Позже привязывается к контексту, а затем может быть изменен.Когда поле изменяется, сущность меняет свое состояние на измененное, поэтому при вызове saveChanges() EF обновляет сущность, а не пытается добавить новую.
Я нахожу эту информацию в этом связь.В этом посте решение заключается в удалении объекта без его извлечения в базу данных, но эта идея работает и в том случае, если мы хотим изменить существующий регистр.