Преобразование представления в таблицы и сохранение изменений дает мне оптимистическое исключение параллелизма

StackOverflow https://stackoverflow.com//questions/10689972

Вопрос

Я работаю с 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 обновляет сущность, а не пытается добавить новую.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top