DbContext.SaveChanges()是否按照添加到DbSet的顺序插入新记录?

时间:2012-03-25 19:52:28

标签: c# entity-framework dbcontext entity-framework-4.3

我的问题是假设简单地插入到没有相关关系的表中。

// 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的顺序插入吗?它们似乎在我的测试中,但我能依靠它吗?

“各种不相关的操作”指的是对相同上下文的不同的,不相关的DbSet的操作;插入,删除和更新的实体(在我的情况下是POCO)

我希望它们按照确切的顺序插入,以便我可以使用pk / identity字段进行排序,但我还需要利用上下文围绕context.SaveChanges()提供的隐式事务。虽然就数据库模式而言,其他操作不相关,但条目本身实际上是关于正在执行的更新的日志条目,并且它们的顺序非常重要。

如果上下文不保证以相同的顺序插入记录,我将不得不在记录中添加日期时间字段,并处理自己的回滚。

4 个答案:

答案 0 :(得分:5)

根据文档不保证这一点。这意味着,您不能依赖此行为。基本上,它归结为你是否愿意承担风险的问题......

  • ...你的传呼机是半夜的?
  • ...你发现,经过一年的运行,这些记录中有10%是腐败而没有任何可能追溯修复它们的?

回答这些问题取决于您。通常,答案应该是“不”。

如果您的测试结果正常,这并不意味着您所谈论的“不相关行为”在极少数情况下不会造成任何干扰。这是一个没有人会在测试过程中注意到的无声错误。

答案 1 :(得分:1)

我认为它没有按照添加的顺序插入,因为我似乎找不到任何确认的相关信息。另一方面,我相信这可能有所帮助,至少我希望如此。 =)

How to observe the Add action of DbSet?

虽然添加DateTime字段可能更容易,但这种方法对于您似乎想要完成的事情看起来很有趣。它建议您订阅Add动作并为自己设置顺序,这样您就可以确保它按照您的意愿插入。

希望这有帮助! =)

答案 2 :(得分:1)

在您的情况下,是否可以使用明确的transatcion?我的意思是我会做类似的事情:

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();
}

答案 3 :(得分:0)

如果只添加行,则可以将pk设为增量,在这种情况下,您可以信任那些顺序正确的行。如果你真的想要上次编辑的时间,尽管你应该按照你的说法使用datetime列。但是,总的来说,如果你想详细说明你正在处理的真正问题,听起来你可以用更加简洁和干净的方式完成所有这些工作。