Devart InsertAllOnSubmit не обновляет сгенерированные поля БД

#linq #oracle #entity-framework #devart

#linq #Oracle #entity-framework #devart

Вопрос:

Я использую Linq от Devart для компонентов Oracle. У меня есть таблица с полем, которое обновляется с помощью последовательности в базе данных. Это отлично работает при вставке одной строки:

 Dim db As New DataContext

db.MyObjects.InsertOnSubmit(MyObject)

db.SubmitChanges()
  

На этом этапе MyObject.Version будет содержать идентификатор версии, который был сгенерирован в базе данных. Итак, я ожидал, что этот код будет работать нормально:

 Dim db As New DataContext

db.MyObjects.InsertAllOnSubmit(MyObjectsList)

db.SubmitChanges()
  

Но когда я делаю это, Version поле остается неизменным во всех объектах в MyObjectsList , даже несмотря на то, что строки добавляются в таблицу.

Чего мне здесь не хватает? Заранее спасибо.

Ответ №1:

Для того, чтобы значение элемента объекта, генерируемое базой данных, извлекалось при вставке этого объекта, одно из следующих значений должно быть true:

  • для свойства «Автоматически сгенерированное значение» этого элемента установлено значение true;
  • свойство ‘Auto-Sync’ этого элемента установлено в ‘OnInsert’ или ‘Always’.

Пожалуйста, проверьте, выполнено ли любое из этих условий. Также, пожалуйста, попробуйте обновить dotConnect для Oracle до версии 6.30.160 (если вы используете предыдущую сборку).

Если проблема не устранена, не могли бы вы, пожалуйста, прислать нам тестовый проект, с помощью которого ее можно воспроизвести?

Ответ №2:

Ну, я нашел проблему, и она не имела никакого отношения к devart. Проблема оказалась в том, что я передавал методу IEnumerable (из MyObject), который был результатом другого запроса. Когда я преобразовал этот список в список (MyObject) и передал его вместо этого, сгенерированные в БД поля действительно появились в моих объектах. Должен признать, я не совсем понимаю, почему это имело значение, но, во всяком случае, это устранило проблему. Надеюсь, это поможет кому-то еще когда-нибудь