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

本文关键字:DbSet 顺序 新记录 插入 添加 SaveChanges 是否 DbContext | 更新日期: 2023-09-27 18:28:54

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

// 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/inidentity字段进行排序,但我也需要利用上下文围绕我的上下文提供的隐式事务。SaveChanges()。尽管就数据库模式而言,其他操作并不相关,但条目本身本质上是关于正在执行的更新的日志条目,它们的顺序至关重要。

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

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

根据文档,这是不能保证的。这意味着,你不能依赖这种行为。基本上,这归结为你是否愿意冒险。。。

  • 。。。你的传呼机半夜响了
  • 。。。你发现,运行一年后,这些记录中有10%是损坏的,没有任何可能追溯修复它们

回答这些问题取决于你。通常情况下,答案应该是"不"。

如果你的测试结果良好,这并不意味着你所说的"无关行为"在极少数情况下不会引起任何干扰。这是一个无声的错误,在测试过程中没有人会注意到。

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

如何观察DbSet的Add操作?

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

希望这能有所帮助

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

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

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