Вставляет ли DbContext.SaveChanges () новые записи в порядке их добавления в DbSet? - PullRequest
0 голосов
/ 25 марта 2012

Мой вопрос предполагает простые вставки в таблицу без соответствующих отношений.

// various unrelated operations w/context...
var one = new DbRecord();
var two = new DbRecord();
var thr = new DbRecord();
context.DbRecords.Add(one);
context.DbRecords.Add(two);
context.DbRecords.Add(thr);
// various unrelated operations w/context...
context.SaveChanges();

В этом случае мои сущности DbRecord всегда будут вставляться в том порядке, в котором я их добавил вDbSet?Похоже, они находятся в моем тестировании, но могу ли я рассчитывать на это?

"различные несвязанные операции" относятся к операциям над различными, не связанными с DbSets одним и тем же контекстом;вставляет, удаляет и обновляет сущности (в моем случае POCO)

Я хочу, чтобы они были вставлены в точном порядке, чтобы я мог использовать поле pk / identity для сортировки, но мне также нужно воспользоватьсянеявная транзакция, которую контекст предоставляет вокруг моего context.SaveChanges ().Хотя другие операции не имеют отношения к схеме базы данных, сами записи по сути являются записями журнала о выполняемых обновлениях, и их порядок является критическим.

Если контекст не гарантирует вставку записейв том же порядке мне придется добавить поле datetime в записи и сам откатиться.

Ответы [ 4 ]

5 голосов
/ 26 марта 2012

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

  • ... твой пейджер исчезает среди ночи?
  • ... вы находите после года работы, что 10% этих записей повреждены без какой-либо возможности исправить их задним числом?

Отвечать на эти вопросы зависит от вас. Обычно ответом должно быть «нет».

Если ваше тестирование прошло успешно, это не значит, что «несвязанные действия», о которых вы говорили, не вызывают каких-либо помех в редких ситуациях. Это тихая ошибка, которую никто не заметит во время тестирования.

1 голос
/ 26 марта 2012

Разве нельзя в вашем случае использовать явную транзакцию?Я имею в виду, я бы сделал что-то вроде:

using (TransactionScope transaction = new TransactionScope()){
  var one = new DbRecord();
  var two = new DbRecord();
  var thr = new DbRecord();
  context.DbRecords.Add(one);
  context.SaveChanges();
  context.DbRecords.Add(two);
  context.SaveChanges();
  context.DbRecords.Add(thr);
  context.SaveChanges();
  // various unrelated operations w/context...
  context.SaveChanges();
  transaction.Complete();
}
1 голос
/ 26 марта 2012

Я предполагаю, что он не вставлен в том же порядке, что и добавленный, так как я не могу найти какую-либо связанную информацию, которая подтверждает это. С другой стороны, я считаю, что это может помочь, по крайней мере, я на это надеюсь. =) * * Тысяча одна

Как наблюдать действие добавления DbSet?

Хотя добавление поля DateTime может быть проще, этот подход выглядит интересным для того, чего вы, похоже, хотите достичь. Он предлагает вам подписаться на действие Add и установить порядок для себя, чтобы вы могли убедиться, что он будет вставлен так, как вы хотите.

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

0 голосов
/ 26 марта 2012

Если вы только добавляете строки, вы можете сделать так, чтобы pk был инкрементным, и в этом случае вы МОЖЕТЕ доверять им, чтобы они были в правильном порядке. Если вам действительно нужно время последнего редактирования, вы должны использовать столбец datetime, как вы сказали. Но, в целом, звучит так, как будто вы можете сделать все это гораздо более просто и аккуратно, если хотите подробнее разобраться с реальной проблемой, с которой вы имеете дело.

...