【问题标题】:The instance of entity type <T> cannot be tracked because another instance with the same key value for {'Id'} is already being tracked无法跟踪实体类型 <T> 的实例,因为已在跟踪具有相同键值 {'Id'} 的另一个实例
【发布时间】:2018-03-02 17:18:04
【问题描述】:

我正在开发一个功能,该功能应该将记录从三个表移动到它们的 Archive* 版本。这些表是问题、操作、附件。首先,我从三个表中获取所有记录,然后制作它们的存档版本并将它们附加到上下文中:

var issue = _ctx.Issues.FirstOrDefault(x=>x.Id == issueId);
var actions = _ctx.Actions.Where(x=>x.IssueId == issueId).ToList();
var attachments = _ctx.Attachments.Where(x=>x.IssueId == issueId).ToList();

_ctx.Attachments.RemoveRange(attachments);
_ctx.Actions.RemoveRange(actions);
_ctx.Issues.Remove(issue);
await _ctx.SaveChangesAsync();

var archiveIssue = new ArchiveIssue(issue);
_ctx.ArchiveIssues.Add(archiveIssue); // this line throws the exception
_ctx.ArchiveActions.AddRange(actions.Select(x=>new ArchiveAction(x)));
_ctx.ArchiveAttachments.AddRange(attachments.Select(x=>new ArchiveAttachment(x)));
await _ctx.SaveChangesAsync();

trx.Commit();

我在 Add() 方法之前检查了 archiveIssue 实体,并且它的 Id 字段具有正确的值。表中没有具有该值的其他记录。我已经尝试过其他几个版本,包括 AsNoTracking()、克隆问题实体或将其状态设置为已删除。

Archive* 表确实有一个键,它们被设置为 ValueGeneratedNever(),例如:

modelBuilder.Entity<ArchiveIssue>()
        .HasKey(c => c.Id);

modelBuilder.Entity<ArchiveIssue>()
        .Property(c => c.Id)
        .ValueGeneratedNever();

ArchiveIssue 构造函数只是将所有值从源实体复制到存档之一:

public ArchiveIssue(Issue issue) {
        this.Id = issue.Id;
        this.Code = issue.Code;     
        this.WeekNo = issue.WeekNo;
        this.WeekCount = issue.WeekCount;
        this.CreateDate = issue.CreateDate;
        ...
}

【问题讨论】:

  • @CamiloTerevinto 添加。感谢您的宝贵时间。
  • Id 的值是多少?当本地更改已经具有该值而不是数据库时会发生错误。检查_ctx.ArchiveIssues.Local.ToList()
  • 那些语句块似乎无关 - 除非 ArchiveIssue 与问题(继承?)有某种关联,否则,您只是有一个导致重复 (NULL) Ids 的逻辑问题。
  • @CamiloTerevinto ArchiveIssues.Local 只有一条记录,即我想附加的一条记录。就这样。它在数据库中没有任何其他记录。这怎么可能?这是接触这些值的唯一方法,它在一个线程上调用。
  • 你有那个之前 _ctx.ArchiveIssues.Add(archiveIssue);吗?如果是这样,您正在复制它

标签: c# entity-framework-core


【解决方案1】:

错误消息只是众多错误中的首要错误,主要原因是:

  • 我在原始问题的存档附件中有一个外键(不是存档问题)。这导致ArchiveAttachment的实体被创建后立即删除,因为FK属性中设置了级联删除。
  • 在 ArchiveActions 中出现类似错误:我在 ArchiveAction 的 ctor 中有一个 this.Issue = action.Issue 行,而那个 action.Issue 只是原始问题,而不是在下一步中删除的存档问题。
  • 我认为交叉外键引发了操作错误,但我不明白为什么。无论如何,修复 FK 后它就消失了。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2021-11-24
    • 2020-10-16
    • 2018-12-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2020-01-31
    相关资源
    最近更新 更多