2009-05-28 5 views
14

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

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

+1

Почему порядок вставки в базу данных SQL имеет значение? –

+5

Порядок вставки не имеет значения, однако порядок первичных ключей делает. – Wouter

ответ

9

Внесение/изменение и удаление заказов в Entity Framework зависит от многих факторов в Entity Framework.

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

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

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

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

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

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

Product 
Category 

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

Category 
Product 

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

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

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

Надеется, что это помогает

Alex

Программа Entity Framework Manager Team

+0

Спасибо за объяснение. Это наверняка спасло бы меня некоторое время, если бы оно было поддержано, но я думаю, что я мог бы также генерировать собственные собственные первичные ключи для достижения того же эффекта. – Wouter

+0

Есть еще несколько ответов на вопрос ниже. Я обошел проблему, заказывая по меткам времени, а не вместо первичного ключа. – Wouter

+3

Любое обновление по этому вопросу? У меня есть situtation, где мои таблицы имеют ограничение на альтернативный ключ, поэтому нет видимых отношений с моделью. (A.K. является userName, а не userId). Итак, как я могу изменить порядок вставок, на данный момент, когда я добавляю пользователя, а затем добавляю пользователя в группу, savechanges терпит неудачу. – hazimdikenli

1

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

list.Add (testObject); list.Add (testObject1);

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

+0

не уверен, что он заметит, когда вы ответите здесь, вы должны, вероятно, также прокомментировать его ответ – Wouter

Смежные вопросы