Ho una relazione uno-a-molti, che ho progettato usando questo. e io uso l'approccio Code-First.
vale a dire:
public class JobData
{
[Key]
public int JobDataId { get; set; }
public int JobId { get; set; }
...
public virtual ICollection<TaskInfo> TaskInfoes { get; set; }
}
Dove TaskInfo
è definito in questo modo:
public class TaskInfo
{
public int TaskInfoId { get; set; }
public int ExecId { get; set; }
public virtual FrameData FrameData { get; set; }
public virtual Card Card { get; set; }
public virtual Tags Tags { get; set; }
public virtual DriverInfo DriverInfo { get; set; }
public virtual JobData JobData { get; set; }
}
FrameData, Card, Tag, DriverInfo sono tutte le entrate one-to-one con TaskInfo:
public class DriverInfo
{
public int DriverId { get; set; }
[ForeignKey("TaskInfo")]
public int DriverInfoId { get; set; }
public virtual TaskInfo TaskInfo { get; set; }
}
Le tabelle vengono create bene con questo approccio, ottengo la tabella JobData e la tabella TaskInfoes, che contengono riferimenti a JobData e ho anche tabelle per ogni classe nidificata in TaskInfo. I dati vengono persino salvati correttamente, quindi, ogni tabella viene popolata. Tuttavia, quando sto cercando di ottenere un'istanza di JobData, ha un intero elenco di TaskInfoes, ma tutte le classi annidate sono sfortunatamente nulle. Cosa sto facendo di sbagliato qui? Ho provato diverse soluzioni, come specificare [Key,ForeignKey("")
nelle classi nidificate, ho provato a creare un contesto separato per TaskInfoes e usare qualcosa del genere:
modelBuilder.Entity<TaskInfo>()
.HasRequired<JobData>(s => s.JobData) // TaskInfo entity requires JobData
.WithMany(s => s.TaskInfoes) // JobData entity includes many TaskInfoes entities
.WillCascadeOnDelete(true);
modelBuilder.Entity<TaskInfo>()
.HasRequired<FrameData>(s => s.FrameData);// TaskInfo entity requires FrameData
Così come:
var data = context.TaskInfoes
.Include(s => s.Framedata)
.Include(s => s.Card)
.Include(s => s.DriverInfo)
.Include(s => s.Tags)
.ToList();
Nulla funziona, le classi annidate sono nulle, non importa cosa. Mi manca totalmente qualcosa di importante qui, potresti dirmi cosa? :)
PS il modo in cui sto ricevendo lavoro è anche l'istanza di Data
return context.Jobs.Find(id);
o
return context.Jobs.SingleOrDefault(job => job.JobId == id);
FrameData, Card, Tag, DriverInfo sono tutte le entrate one-to-one con TaskInfo:
Non è necessario fare riferimento ad esempio a TaskInfo con un oggetto DriverInfo e l'oggetto DriverInfo con l'oggetto TaskInfo. Basta avere un oggetto che faccia riferimento all'altro oggetto.
TaskInfo ha FK che sono PK degli altri oggetti FrameData, Card, Tag, DriverInfo.
public class TaskInfo
{
public int TaskInfoId { get; set; }
public int ExecId { get; set; }
.../...
public int DriverInfoId { get; set; } // The PK of DriverInfo
public virtual DriverInfo DriverInfo { get; set; }
}
Rimuovi il riferimento a TaskInfo.
public class DriverInfo
{
public int DriverId { get; set; }
public int DriverInfoId { get; set; }
}
Sarebbe meglio usare FirstOrdefault perché gestirà un ritorno nullo.
return context.Jobs.FirstOrDefault(job => job.JobId == id);