2014-03-25 12 views
1

我在這裏有一個非常奇怪的問題,我沒有任何線索爲什麼。SQL查詢顯示良好的數據庫值,但LINQ to Entity框架從零開始帶來空值

我應該在C#中製作一個小的localdb控制檯應用程序。目標是在數據庫中輸入人員(實際上是教師),並提供一定數量的信息。

我有幾個類,但其中2個是重要的:認證和表示法。 認證是教授們的認證。

這些類的代碼是這樣的:

class Certification 
{ 
    public int CertificationID { get; set; } 
    public virtual Teacher Teacher { get; set; } 
    public virtual Course Course { get; set; } 
    public string CertificationName { get; set; } 
    public virtual Notation Notation { get; set; }  
}  
class Notation 
{ 
    public int NotationID {get;set;} 
    public string Note {get;set;} 
} 

沒有什麼太危險了。通過遷移我做我的數據庫,他們看起來像他們應該:

認證:

CertificationID (PK) 
CertificationName 
Course_CourseID (FK to another class, course) 
Notation_NotationID (FK to notations) 
Teacher_TeacherID (FK to the teachers) 

符號:

NotationID (PK) 
Note 

我的程序允許我補充教師,有我需要的所有信息,例如,他們的認證。在這裏,我做了一個假老師,帶着一個虛擬認證。 如果我叫SELECT * FROM認證,我得到正是我應該得到的,一行是這樣的:

CertificationID = 6 
CertificationName = placeholder 
Course_CourseID = 13 
Notation_NotationID = 12 
Teacher_TeacherID = 5 

一切都在這個正確的。 CourseID鏈接到數據庫中的實際課程,實際註釋中的NotationID以及教師與實際的教師。一切安好!現在

,我只是想表明我們的老師的證書:

var certifs = from c in db.Certifications where c.Teacher.TeacherID == item.TeacherID select c; 

foreach(var v in certifs) 
{ 
    var course = (from c in db.Courses where c.CourseID == v.Course.CourseID select c).First(); 
    var note = (from n in db.Notations where n.NotationID == v.Notation.NotationID select n.NotationID).First(); 

    Console.WriteLine("Name: " + v.CertificationName + ", related to the " + course.CourseName + " course, with a note of " + note); 

    Console.WriteLine(""); 
} 

而且這是行不通的。當我的foreach循環開始時,循環中的第一項沒有任何對符號的引用。其他一切都很好:課程和教師的外鍵在這裏,並且是有效的,但對於符號,我只能得到一個空值。所以,我的認證項目看上去更像是:

CertificationID = 6 
CertificationName = placeholder 
Course_CourseID = 13 
Notation_NotationID = null 
Teacher_TeacherID = 5 

基本上,如果我做一個SQL查詢,我在數據庫行是完全沒有問題的,但稱這是通過實體框架(和LINQ)返回的空值符號。 (這調用VAR筆記等時拋出一個異常....

有誰對這個想法?我真的被困在此。

對不起,如果我的英語不夠好如果你們需要更多的信息,只問

由JC Anwsered:。

延遲加載心不是正常預先加載解決了這個問題

+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

2

問題是你不填充您的導航性能。當您檢索證書時離子實體。然後你嘗試訪問它們,它們是空的。

要麼你需要確保延遲加載打開時:

其中
Configuration.LazyLoadingEnabled = true; //In your DbContext's constructor 

情況下,只需訪問課程和通知引用應使它們在單獨的數據庫事務來填充......

...或者你需要使用預先加載查詢對DbSet時:

var certifs = from c in db.Certifications.Include(c=>c.Course).Include(c=>c.Notation) where ... 

這將導致課程和符號來的SA加載我的時間認證被加載到一個數據庫事務中。

+0

只是一個問題:'First()'不會導致數據加載? –

+0

您對符號和課程DbSets調用First(),但在您嘗試訪問在循環外部檢索的認證實體的課程和符號屬性的那些查詢中。當'v.Course'和'v.Notation'爲空時,嘗試訪問'v.Course.CourseId'和'v.Notation.NotationId'就會產生null異常。 –

+0

事情是,v.Course不是null!因爲我在循環中檢索它們:foreach檢索它們。 由於我的類(iirc)中有虛擬屬性,已經啓用了延遲加載。 這就是實際的問題,一切都加載正常,除了符號。 請參閱:https://www.dropbox.com/s/86aa1w9zjvurjv5/certstate.png – BLo

1

在你行

var note = (from n in db.Notations 
where n.NotationID == v.Notation.NotationID 
select n.NotationID).First(); 

您選擇n.NotationID只因爲這隻會返回一個整數。嘗試將select更改爲select n