Sto cercando di costruire una struttura di oggetti 'Lavoro'. Questi sono usati per descrivere un intero processo che una persona dovrebbe fare.
Per esempio.
Se il lavoro avesse la descrizione "Fai il caffè", avrebbe una lista di altri lavori che, una volta fatti tutti insieme, producono un caffè.
Una struttura di esempio potrebbe essere:
Make Coffee
|- Boil Kettle
|- Fill Kettle
|- Turn on Kettle
|- Get a cup
|- Place instant coffee in the cup
|- Pour boiling water in the cup
|- Add milk to the cup
Dovrebbe anche essere notato, ogni lavoro ha un numero di versione; e VersionOfID. Questo è nel caso in cui un lavoro debba essere cambiato, solo una versione è 'Live' ed è quella che verrà utilizzata.
Sto aggiungendo oggetti a EF Core DBContext, e prima chiamo SaveChanges, posso vedere la struttura correttamente; Tuttavia, una volta chiuso / ricaricato il contesto, i lavori non si riferiscono più l'un l'altro. Posso vedere in SQL Management Studio il ParentID è nullo per tutti gli oggetti.
La classe per Job è la seguente:
public class Job
{
public int JobId { get; set; }
[Required]
public string Description { get; set; }
public string Code { get; set; }
public int Quantity { get; set; } = 1;
public int Time { get; set; }
public TimeUnit UnitOfTime { get; set; }
[ForeignKey("VersionOf")]
public int? VersionOfId { get; set; }
public virtual Job VersionOf { get; set; }
public int JobVersion { get; set; } = 1;
[ForeignKey("Parent")]
public int? ParentId { get; set; }
public virtual Job Parent { get; set; }
public virtual List<Job> Jobs { get; set; } = new List<Job>();
public void AddJob(Job job)
{
job.Parent = this;
Jobs.Add(job);
}
}
public enum TimeUnit
{
Seconds,
Minutes,
Hours,
Days,
Weeks,
Months,
Years
}
Li sto aggiungendo al contesto in questo modo:
DatabaseContext dbContext = new DatabaseContext();
Job PK3 = new Job()
{
Code = "PK3",
Description = "Scan Item",
Time = 7,
UnitOfTime = TimeUnit.Seconds,
};
dbContext.Jobs.Add(PK3);
Job PK4 = new Job()
{
Code = "PK4",
Description = "Pick Item",
Time = 15,
UnitOfTime = TimeUnit.Seconds,
};
dbContext.Jobs.Add(PK4);
Job PK5 = new Job()
{
Code = "PK5",
Description = "Walk To Item",
Time = 60,
UnitOfTime = TimeUnit.Seconds,
};
dbContext.Jobs.Add(PK5);
Job OP1 = new Job()
{
Code = "OP1",
Description = "Entire Item Pick",
Quantity = 1,
};
OP1.AddJob(PK5);
OP1.AddJob(PK4);
OP1.AddJob(PK3);
dbContext.Jobs.Add(OP1);
try
{
int a = dbContext.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
Puoi vedere come appare la tabella qui:
Ho pensato che potrebbe essere todo con LazyLoading, che ho abilitato con:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"<--snip-->");
optionsBuilder.UseLazyLoadingProxies();
}
Tuttavia, ho rimosso questo e questo problema continua.
Qualcuno sa come risolvere questo problema?
@ David Browne - Microsoft ha ragione, il problema era che l'EF Core semplicemente non sapeva come gestire entrambe le Foreign Keys. Aggiungendo quanto segue al mio OnModelCreating ho risolto questo problema per me.
Non sono sicuro che questo sia il modo "corretto" per farlo, ma funziona per me.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Job>().HasOne(j => j.Parent);
modelBuilder.Entity<Job>().HasOne(j => j.VersionOf);
}
Manca l'assegnazione di Parent
Job PK4 = new Job()
{
Code = "PK4",
Description = "Pick Item",
Time = 15,
UnitOfTime = TimeUnit.Seconds,
Parent = PK3 //add this line!
};