Структура объекта порядка вставки строк - PullRequest
15 голосов
/ 28 мая 2009

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

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

Ответы [ 2 ]

10 голосов
/ 28 мая 2009

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

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

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

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

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

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

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

Product
Category

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

Category
Product

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

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

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

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

Alex

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

1 голос
/ 23 сентября 2009

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

list.Add (TestObject); list.Add (testObject1);

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

...