Sto lavorando a una funzione che dovrebbe spostare i record da tre tabelle alle loro versioni di Archive *. Le tabelle sono Problemi, Azioni, Allegati. Per prima cosa ottengo tutti i record dalle tre tabelle, quindi creo le loro versioni di archivio e le allego al contesto:
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();
Ho controllato l'entità archiveIssue prima del metodo Add () e il suo campo Id ha il valore corretto. Non ci sono altri record nella tabella con quel valore. Ho già provato diverse altre versioni, tra cui AsNoTracking (), clonando l'entità del problema o impostando il suo stato su Deleted.
Le tabelle Archive * hanno una chiave e sono impostate su ValueGeneratedNever () come:
modelBuilder.Entity<ArchiveIssue>()
.HasKey(c => c.Id);
modelBuilder.Entity<ArchiveIssue>()
.Property(c => c.Id)
.ValueGeneratedNever();
ArchiveIssue constructor copia solo tutti i valori dall'entità source a quella Archive:
public ArchiveIssue(Issue issue) {
this.Id = issue.Id;
this.Code = issue.Code;
this.WeekNo = issue.WeekNo;
this.WeekCount = issue.WeekCount;
this.CreateDate = issue.CreateDate;
...
}
Il messaggio di errore era solo la parte superiore di molti errori e le cause principali erano: