我有一对多关系,这是我用这个设计的。 我使用代码优先方法。
即:
public class JobData
{
[Key]
public int JobDataId { get; set; }
public int JobId { get; set; }
...
public virtual ICollection<TaskInfo> TaskInfoes { get; set; }
}
其中TaskInfo
定义如下:
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,Tags,DriverInfo都是与TaskInfo一对一的入口:
public class DriverInfo
{
public int DriverId { get; set; }
[ForeignKey("TaskInfo")]
public int DriverInfoId { get; set; }
public virtual TaskInfo TaskInfo { get; set; }
}
使用这种方法可以很好地创建表,我得到了JobData表和TaskInfoes表,它们包含对JobData的引用,并且我还有TaskInfo中每个嵌套类的表。数据甚至被正确保存,因此,每个表都被填充。但是,当我尝试获取jobData实例时,它具有完整的任务信息列表,但不幸的是,所有嵌套类都是空的。 我在这里做错了什么? 我一直在尝试不同的解决方案,例如在嵌套类中指定[Key,ForeignKey("")
,尝试为 TaskInfoes 创建单独的上下文并使用如下所示的内容:
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
以及:
var data = context.TaskInfoes
.Include(s => s.Framedata)
.Include(s => s.Card)
.Include(s => s.DriverInfo)
.Include(s => s.Tags)
.ToList();
什么都不起作用,无论如何嵌套类都是空的。我在这里完全错过了一些重要的东西,你能告诉我什么吗?:)
附言我获取工作数据实例的方式是
return context.Jobs.Find(id);
或
return context.Jobs.SingleOrDefault(job => job.JobId == id);
FrameData、Card、Tags、DriverInfo 都是与 TaskInformation 一对一的入口:
例如,您不需要引用具有 DriverInfo 对象和具有 TaskInfo 对象的 DriverInfo 对象。只需让一个对象引用另一个对象。
TaskInfo具有FK,它们是其他对象FrameData,Card,Tags,DriverInfo的PK。
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; }
}
删除对任务信息的引用。
public class DriverInfo
{
public int DriverId { get; set; }
public int DriverInfoId { get; set; }
}
最好使用 FirstOrdefault,因为它将处理空返回。
return context.Jobs.FirstOrDefault(job => job.JobId == id);