Sql server 在DbContext.SubmitChanges()上保证插入行的顺序
具有自动递增主键的给定记录表 将实体添加到DbContext时,如下所示:Sql server 在DbContext.SubmitChanges()上保证插入行的顺序,sql-server,entity-framework-core,Sql Server,Entity Framework Core,具有自动递增主键的给定记录表 将实体添加到DbContext时,如下所示: using (var dbContext = new MyDbContext()) { dbContext.Records.Add(new Record { TypeId = "TYPE1" }); dbContext.Records.Add(new Record { TypeId = "TYPE2" }); dbContext.Records.Add(new Record { TypeId = "TY
using (var dbContext = new MyDbContext())
{
dbContext.Records.Add(new Record { TypeId = "TYPE1" });
dbContext.Records.Add(new Record { TypeId = "TYPE2" });
dbContext.Records.Add(new Record { TypeId = "TYPE3" });
dbContext.SaveChanges();
}
那么,我能指望记录的ID将以与我向DB上下文添加实体相同的顺序递增吗?
我想知道下面的查询以相同的顺序返回记录
var records = dbContext.Records.AsNoTracking().OrderBy(r => e.RecordId).ToList();
实体定义如下
public partial class Record
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(TypeName = "numeric(10, 0)")]
public decimal RecordId { get; set; }
[StringLength(8)]
public string TypeId { get; set; }
[ForeignKey(nameof(TypeId))]
public RecordType Type {get; set;}
}
modelBuilder.Entity<Record>(entity =>
{
entity.HasOne(record => record.Type)
.WithMany(type => type.Records)
}
公共部分类记录
{
[数据库生成(DatabaseGeneratedOption.Identity)]
[列(TypeName=“numeric(10,0)”)]
公共十进制记录ID{get;set;}
[第(8)款]
公共字符串TypeId{get;set;}
[外键(名称(类型ID))]
公共记录类型类型{get;set;}
}
modelBuilder.Entity(Entity=>
{
entity.HasOne(record=>record.Type)
.WithMany(type=>type.Records)
}
*注意:我有一些查询,需要按照插入事件的相同顺序获取事件。我有时间戳,但如果记录是在单个事务中生成的,我需要额外的排序依据。我不会,特别是在多用户环境中。不需要依赖于此。主键用于在选项卡中唯一定义一行le.它们不需要按顺序排列,也不需要按顺序排列。多用户环境与此有什么关系?我只关心我上下文中记录的顺序,我不介意在它们之间插入其他记录。我知道你希望标识为1,2,…按顺序排列。我不相信,但它确实如此。我不明白为什么会这样我认为每个人都应该依赖于顺序,也许你可以解释一下。如果你真的想确保PK按照你期望的顺序递增,我认为你最安全的方法是在它自己的事务中处理每个插入。如果在一个事务中有多个插入,那么SQL引擎将决定它们的提交顺序。如果您将标识列视为恰好适合数字列/变量的不透明blob。一切都会好起来。只要您想关心数字值,比较它们(除了相等)等,您就进入了危险的领域。如果顺序很重要,为什么不显式地用另一个属性/列对顺序建模?