2017-08-11 142 views
1

我有一對多的關係,我使用this. 設計,我使用的是Code-First方法。實體框架 - 嵌套實體爲空

即:

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,卡片,標籤,DriverInfo都是一個一對一的entites與TASKINFO:

public class DriverInfo 
{  
    public int DriverId { get; set; } 

    [ForeignKey("TaskInfo")] 
    public int DriverInfoId { get; set; } 
    public virtual TaskInfo TaskInfo { get; set; } 
} 

使用這種方法創建表格就好了,我得到了JobData表和TaskInfoes t能夠保持對JobData的引用,並且我還爲TaskInfo中的每個嵌套類都提供了表。數據甚至保存正確,因此每個表都被填充。但是,當我試圖獲取jobData實例時,它具有TaskInfoes的完整列表,但是所有嵌套類都不幸爲空。 我在這裏做錯了什麼? 我一直在嘗試不同的解決方案,如在嵌套類指定[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(); 

沒有什麼工作,嵌套類無論如何都是空的。我完全錯過了一些重要的東西,你能告訴我什麼嗎? :)

P.S.我越來越jobData實例的方式或者是

return context.Jobs.Find(id); 

return context.Jobs.SingleOrDefault(job => job.JobId == id); 
+0

看起來像不正確的「一對一」配置。您是否正在映射到退出數據庫,或者是從上述模型的Code First遷移生成的?我們可以看到例如'DriverInfo' **表**嗎? –

+0

嗯,我在想這個,確實,嵌套的類表沒有任何鍵......爲什麼?這裏是[表格](https://yadi.sk/i/RmZKncZm3Lup3s) P.S.我從[這裏]使用「使用DataAnnotations配置一對一或一個關係:」(http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in- code-first.aspx) – Amarula

+0

代碼中的「TaskInfo.JobData」在哪裏? – grek40

回答

0

FrameData, Card, Tags, DriverInfo are all one-to-one entites with TaskInfo:

你不需要例如TASKINFO引用爲具有DriverInfo對象和DriverInfo物體與物體TASKINFO 。只需要一個對象引用另一個對象。

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

} 

刪除對TaskInfo的引用。

public class DriverInfo 
{  
    public int DriverId { get; set; } 
    public int DriverInfoId { get; set; } 
} 

使用FirstOrdefault將會更好,因爲它將處理空返回。

return context.Jobs.FirstOrDefault(job => job.JobId == id); 
+0

我不知道你正在試圖讓這個查詢'VAR數據= context.TaskInfoes .INCLUDE(S​​ => s.Framedata) .INCLUDE(S​​ => s.Card) .INCLUDE(S​​ = > s.DriverInfo) .INCLUDE(S​​ => s.Tags) .ToList();' –

+0

這僅僅是沒有道理的浪費使事情工作8小時後。我會嘗試你的解決方案。 – Amarula

+0

@Amarula如果一個對象**必須有另一個對象作爲它的一部分 - 給該對象另一個對象的FK -PK。開始時這些都是簡單的錯誤 - 這可能會讓人困惑。 –