0

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

// 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

4 回答 4

5

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

  • ...您的寻呼机在半夜响起?
  • ...您发现,运行一年后,这些记录中有 10% 已损坏,无法追溯修复?

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

如果您的测试正常,这并不意味着您所说的“不相关的操作”在极少数情况下不会引起任何干扰。这是一个无声的错误,在测试期间没有人会注意到。

于 2012-03-25T20:18:39.357 回答
1

我认为它的插入顺序与添加的顺序不同,因为我似乎找不到任何证实这一点的相关信息。另一方面,我相信这会有所帮助,至少我希望如此。=)

如何观察 DbSet 的 Add 动作?

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

希望这可以帮助!=)

于 2012-03-25T20:17:40.237 回答
1

在您的情况下是否可以使用显式事务?我的意思是我会做类似的事情:

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();
}
于 2012-03-25T21:26:25.403 回答
0

如果您只添加行,您可以让 pk 是增量的,在这种情况下,您可以相信这些行的顺序是正确的。如果你真的想要最后一次编辑的时间,尽管你应该使用你所说的日期时间列。但是,总的来说,如果你想详细说明你正在处理的真正问题,听起来你可以用一种更简单、更干净的方式来完成这一切。

于 2012-03-25T20:22:33.717 回答