我正在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);
}