实体框架 - 嵌套实体为空



我有一对多关系,这是我用这个设计的。 我使用代码优先方法。

即:

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);

最新更新