实体框架中每次保存更改后,标识列都会更改



我正在EF Core中进行更新。在这个更新过程中,我有多个对象。

但在每次savechanges操作之后,相关表中的主键Identity字段都会以更改的方式进行更新,并且因为它更改了Id字段,所以它在我添加的数据中以混乱的方式执行更新过程。

这就是我获取数据的方式,作为一个例子,它以列表的形式出现。

var vPrecondition = issueInfo.IssuePreconditionInfos.Select(x => new IssuePrecondition
{
LineNo = x.LineNo,
Explanation = x.Explanation,
});

然后我就这样转移。

vIssue.IssuePreconditions = vPrecondition.ToList();

我与EF Core的数据和传输操作如下。

我的示例代码:

var vIssue =  _context.Issues
.Include(x => x.IssueActivitiys)
.ThenInclude(x => x.IssueActivitiyDetails)
.Include(x => x.IssuePreconditions)
.Include(x => x.IssueNotes)
.Include(x => x.IssueRelevantDepartmants)
.Include(x => x.IssueAttachments)
.Include(x => x.IssueRoles)
.FirstOrDefault(x => x.Id == issueInfo.Id);

vIssue.TitleId = issueInfo.TitleId;
vIssue.SubtitleId = issueInfo.SubtitleId;
vIssue.Summary = issueInfo.Summary;
vIssue.Status = ActivityStatuses.Processing;
vIssue.IssueActivitiys = vIssueActivitiys.ToList();
vIssue.IssueNotes = vIssueNote.ToList();
vIssue.IssuePreconditions = vPrecondition.ToList();
vIssue.IssueRelevantDepartmants = vRevelantDepartment.ToList();
vIssue.IssueRoles = vIssueRole.ToList();

vIssue.IssueNo = 0;
vIssue.VersionNo = 0;

await _context.SaveChangesAsync();

在采取上述行动之前,

Id    Summary
474   foo
475   bar
476   example

正在进行

但在savechanges之后

Id    Summary
477   bar
478   foo
479   example

以形式发生

我的FluentApi模型配置设置和Precondition表的配置设置只是一个例子。

public void Configure(EntityTypeBuilder<IssuePrecondition> modelBuilder)
{
modelBuilder.ToTable("IssuePrecondition");
modelBuilder.Property(e => e.Explanation)
.IsRequired()
.HasMaxLength(512)
.IsUnicode(false)
.HasComment("Açıklama");
modelBuilder.Property(e => e.IssueId).HasComment("Konu Id");
modelBuilder.Property(e => e.LineNo).HasComment("Satır No");
}

如何确保我的Id字段在更新过程中不会更改,或者如何防止我的数据在savechanges之后更改?

如果你想让你的新行准确地得到下一个数字,你应该小心:

  • 标识列随每个事务而更改,即使该事务未成功
  • 那么您应该在调用SaveChange之前检查所有验证
  • 另外,如果你想确切地得到下一个数字,你应该创建一个SERIALIZABLE事务,但我根本不建议这样做
  • 如果希望数据在表中的位置不变,则应更改ClusterIndex
public void Configure(EntityTypeBuilder<ListingData> builder)
{
builder.HasKey(e => e.Id).IsClustered(false);
builder.HasIndex(e => e.code, "ix_code").IsClustered(true);
}

最新更新