Sto cercando di impostare una relazione tra un oggetto e le versioni dello stesso oggetto. Sto usando EFCore e il suo salvataggio dell'ID da uno degli oggetti in entrambi i campi.
I miei oggetti sono i seguenti:
public class Workflow
{
public int WorkflowId { get; set; }
[ForeignKey("Parent")]
public int? ParentId { get; set; }
public virtual Workflow Parent { get; set; }
public virtual List<Workflow> Workflows { get; set; } = new List<Workflow>();
public int InternalSequence { get; set; }
public decimal Quantity { get; set; }
public virtual List<WorkflowVersionLink> VersionLinks { get; set; } = new List<WorkflowVersionLink>();
}
public class WorkflowVersionLink
{
public int WorkflowVersionLinkId { get; set; }
public int? IsVersionOfId { get; set; }
public virtual Workflow IsVersionOf { get; set; }
public int? VersionId { get; set; }
public virtual Workflow Version { get; set; }
public bool IsLive { get; set; }
}
E sto configurando OnModelCreating come segue:
//All of my attempts have used this:
modelBuilder.Entity<WorkflowVersionLink>()
.HasKey(t => new { t.IsVersionOfId, t.VersionId });
//Attempt one: No manual configuration
//Attempt two:
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);
//Attempt three (following info from SO):
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.IsVersionOf)
.WithMany()
.HasForeignKey(lk => lk.IsVersionOfId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);
Ho già provato l'approccio qui: relazione auto-referenziale many-to-many e gli altri approcci menzionati sopra.
Sono aperto a modificare la struttura, prima di tutto questo non ho utilizzato l'oggetto WorkflowVersionLink e ho appena avuto una versione di elenco, tuttavia questo non è riuscito anche perché ho già un elenco di flussi di lavoro figlio (che devo tenere)
Come puoi vedere, ho provato a risolvere questo problema da solo, ma ora sono bloccato e ho deciso di passare a StackOverflow.
Puoi vedere il risultato del database qui: (Sono sicuro al 100% di aver aggiunto due nuovi oggetti che non hanno ID ogni volta che ho eseguito il codice) risultato del database
Cosa sto facendo di sbagliato qui?
Grazie
Sarei più sicuro che stai creando nuovi oggetti per Version e isVersionOf nell'oggetto WorkflowVersionLink. Se stai provando a crearne una, potresti riferirti allo stesso oggetto per sbaglio.
modelBuilder.Entity<WorkflowVersionLink>()
.HasKey(t => t.WorkflowVersionLinkId );
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.Version)
.WithMany(wf => wf.VersionLinks)
.HasForeignKey(lk => lk.VersionId);
modelBuilder.Entity<WorkflowVersionLink>()
.HasOne(lk => lk.IsVersionOf)
.HasForeignKey(lk => lk.IsVersionOfId)
Potrebbe essere ancora necessario aggiungere vincoli per mantenere pulito il database