Структура сущности заказа на вставку строк

Я использую транзакцию для вставки нескольких строк в несколько таблиц. Для этих строк я хотел бы добавить эти строки по порядку. При вызове SaveChanges все строки вставляются не по порядку.

Когда не используется транзакция и сохраняются изменения после каждой вставки, порядок сохраняется, но мне действительно нужна транзакция для всех записей.


person Wouter    schedule 28.05.2009    source источник
comment
Почему порядок вставки в базу данных SQL имеет значение?   -  person Harper Shelby    schedule 28.05.2009
comment
Порядок вставки не имеет значения, однако имеет значение порядок первичных ключей.   -  person Wouter    schedule 03.06.2009


Ответы (2)


Порядок вставки/обновления и удаления в Entity Framework зависит от многих вещей в Entity Framework.

Например, если вы вставляете новый продукт в новую категорию, мы должны добавить категорию перед продуктом.

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

Порядок действий в контексте может противоречить этим правилам. Например, если вы сделаете это:

ctx.AddToProducts(
   new Product{
      Name = "Bovril",
      Category = new Category {Name = "Food"}
   }
);

эффект заключается в том, что сначала добавляется Продукт (в контекст), а затем, когда мы проходим по графику, мы также добавляем Категорию.

то есть порядок вставки в контекст:

Product
Category

но из-за ограничений ссылочной целостности мы должны изменить порядок, прежде чем пытаться вставить в базу данных:

Category
Product

Таким образом, этот вид локального повторного заказа не подлежит обсуждению.

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

Однако мы обсуждали это совсем недавно, так что мне интересно узнать, насколько это жизненно важно для вас?

Надеюсь это поможет

Алекс

Руководитель программы Entity Framework Team

person Alex James    schedule 28.05.2009
comment
Спасибо за объяснение. Это, безусловно, сэкономило бы мне время, если бы оно поддерживалось, но я думаю, что я мог бы также сгенерировать свои собственные первичные ключи для достижения того же эффекта. - person Wouter; 03.06.2009
comment
Ниже приведены некоторые другие ответы на вопрос. Я обошел проблему, заказав временные метки или что-то еще вместо первичного ключа. - person Wouter; 06.05.2010
comment
Есть новости по этому поводу? У меня есть ситуация, когда мои таблицы имеют ограничение на альтернативный ключ, поэтому в модели нет видимой связи. (AK — это имя пользователя, а не идентификатор пользователя). Итак, как я могу изменить порядок вставок, на данный момент, когда я добавляю пользователя, а затем добавляю пользователя в группу, сохранение изменений не выполняется. - person hazimdikenli; 26.10.2010
comment
Мы используем столбец с автоматическим приращением в качестве прокси для созданного/вставленного порядка при атомарной вставке графов объектов. Так что в настоящее время это не работает для нас в EF. Изменение порядка вставки на основе зависимостей — это хорошо, но было бы здорово сохранить порядок вставки, чтобы мы могли повторно использовать этот столбец с автоинкрементом, а не вводить столбец SortOrder/CreationOrder и еще один обходной путь EF. На данный момент, после того, как зависимости удовлетворены, кажется, что объекты вставляются в порядке их EntityKey, а не в порядке создания. - person Simon Francesco; 06.05.2013
comment
Есть ли способ получить доступ к порядку, в котором объекты будут сохранены в базе данных во время вызова SaveChanges()? Мы уже перебираем их с переопределением, но если бы мы могли перебирать их в том же порядке, в котором они сохраняются, это помогло бы решить некоторые другие наши проблемы. - person Chuck; 18.02.2016
comment
Это ограничение структуры сущностей стало для нас довольно важным. Мы принимаем массивы объектов через наш API, и у нас есть алгоритм автоматической нумерации для некоторых наших данных. Нам нужно убедиться, что элементы попадают в таблицу в том порядке, в котором они добавляются в Entity Framework API. В частности, мы вызываем метод DBSet‹›.AddRange(). Есть ли какой-нибудь обходной путь для этого, кроме обхода EF? - person Damon Warren; 05.08.2016
comment
Мы смогли обойти эту проблему, так что она больше не критична для нас. - person Damon Warren; 05.08.2016
comment
Я просто попытался вручную установить столбец идентификаторов, и это сработало. Итак, уродливый обходной путь, но он быстрый. Когда гуглю проблему - конечно есть платное решение. Так что, возможно, это основная причина, хотя порядок может быть сохранен, но не будет. И я бы сказал, что цена довольно жесткая для новых игроков, таких как стартапы. Поэтому пока мы придерживаемся уродливых обходных путей. - person Harry; 09.09.2019

Я в процессе перехода по этому мосту. Я заменяю NHibernate на EF, и проблема, с которой я сталкиваюсь, заключается в том, как списки вставляются в БД. Если я добавлю элементы в такой список (в псевдокоде):

список.Добавить(тестовыйОбъект); список.Добавить(тестовыйОбъект1);

В настоящее время мне не гарантируется получение того же порядка при запуске «SaveChanges». Это позор, потому что мой объект списка (то есть связанный список) знает порядок, в котором он был создан. Объекты, которые связаны вместе с помощью ссылок, ДОЛЖНЫ быть сохранены в БД в том же порядке. Не уверен, почему вы упомянули, что «обсуждаете» это. знак равно

person Community    schedule 23.09.2009
comment
не уверен, что он заметит, когда вы ответите здесь, вам, вероятно, также следует прокомментировать его ответ - person Wouter; 23.09.2009