我的问题是假设简单地插入到没有相关关系的表中。
// 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()提供的隐式事务。虽然就数据库模式而言,其他操作不相关,但条目本身实际上是关于正在执行的更新的日志条目,并且它们的顺序非常重要。
如果上下文不保证以相同的顺序插入记录,我将不得不在记录中添加日期时间字段,并处理自己的回滚。
答案 0 :(得分:5)
根据文档不保证这一点。这意味着,您不能依赖此行为。基本上,它归结为你是否愿意承担风险的问题......
回答这些问题取决于您。通常,答案应该是“不”。
如果您的测试结果正常,这并不意味着您所谈论的“不相关行为”在极少数情况下不会造成任何干扰。这是一个没有人会在测试过程中注意到的无声错误。
答案 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列。但是,总的来说,如果你想详细说明你正在处理的真正问题,听起来你可以用更加简洁和干净的方式完成所有这些工作。