2011-10-05 126 views
1

我問了一個question recently,坦率地說,從給出的答案,我第二次猜測我的整個策略/我如何設計類和數據庫。實體框架類/數據庫架構建議需要

我還沒有在我的任何實體框架項目中使用virtual關鍵字,也沒有使用過Icollection,坦率地說,在reading about it in之後的一些例子中我並不完全理解爲什麼需要它,或者它是如何工作的。

在示例應用程序中,我有一個簡單的設計,其中有三個列表 - 人員,筆記和圖片。這種關係是這樣的:一個人可以擁有多張筆記和圖片,以及具有圖片標識的人。

public class Person 
    { 
     public int ID { get; set; } 
     public string name { get; set; } 
     public Picture logo { get; set; } 
    } 

    public class Note 
    { 
     public int ID { get; set; } 
     public string Text { get; set; } 
     public Person Owner { get; set; } 
    } 

public class Picture 
    { 
     public int ID { get; set; } 
     public string Path { get; set; } 
     public Person Owner { get; set; } 
    } 

當我要選擇的,一個人擁有的筆記列表,我只是執行db.Notes.Where(x=>x.owner=="y")上的音符對象。我想我明白,如果我要在人員課程上使用Icollection,則可以按照db.person.select(x=> x.notes)的順序執行某些操作來檢索所有筆記。我在這個想法中糾正了嗎?

如果你在上面這個相對簡單的例子中,你將如何構建類(包括ICollection,虛擬或其他)?

此外,最重要的是,上面只是一個例子,但是在我的實際應用中,我使用了一個非常類似的結構,我使用自定義類型作爲「連接器」/外鍵。

在很多例子中,我一直在閱讀(在上面的例子中),他們將使用public int OwnerID而不是public person Owner。這實際上引發了我,我質疑我的整個英孚戰略。有什麼區別?

任何意見將不勝感激。

+0

是的,與SQL相比,EF是一種範例轉換,我會使用最終設計[我給你]來設計它(http://stackoverflow.com/questions/7638992/entity-framework-code-first-協會-FK-問題 - 和 - 假設 - 默認值)。 –

回答

0

我認爲你正在使這個更加困難,這是需要的。如果你正在規劃普通課程,你會將它們相互關聯,而不是找到相關的ID並單獨加載它們,你在你的例子中正在進行。

public class Person 
{ 
    public int ID { get; set; } 
    public string name { get; set; } 
    public ICollection<Note> Notes { get; set; } 
    public ICollection<Picture> Pictures { get; set; } 
    public Picture logo { get; set; } 
} 

public class Note 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
    public Person Owner { get; set; } 
} 

public class Picture 
{ 
    public int ID { get; set; } 
    public string Path { get; set; } 
    public Person Owner { get; set; } 
} 

那麼現在說你已經使用查詢

var person = _context.People.Where(m=>m.ID=randomIntWeWant).First(); 

我們可以得到所有相關的項目,如性能得到你的人對象。

對於Notes

person.Notes 

的照片

person.Photos 

ICollection的有關延遲加載。通過在一側聲明一個屬性爲ICollection,你的意思是你在對象之間有一個多對一的關係。如果你在雙方聲明一個屬性爲ICollection,那麼你就說這是一個多對多的關係。 EF負責創建跟蹤該關係的表格。