2016-11-30 79 views
0

我有一個實體作爲學生如何建模一對多的關係指向由不同的實體相同的實體在EF

public class Student{ 

.. 

public ICollection<Picture> Pictures {get;set;} 

}

與學校實體

public class School{ 

.. 

public ICollection<Picture> Pictures {get;set;} 
} 

當我創建此模型並運行遷移我可以看到,在數據庫的Pictures表中,2個外鍵屬性已經創建爲StudentId和SchoolId。

在Pictures表中有這些外鍵是不正確的。

未來,如果另一個實體需要有圖片列表,那麼這意味着圖片表中的另一個外鍵屬性。

如何在代碼優先模型中更改此行爲?或者這是正確的方法?

回答

1

如果圖片不能在學校和學生之間共享,您可以爲兩種圖片類型創建單獨的實體。要做到這一點,最好的方法是創建每個特定畫面類型的基類和派生類:

public abstract class Picture 
{ 
    public int Id { get; set; } 
    // ... 
} 
public class SchoolPicture : Picture 
{ 
    // ... 
} 
public class StudentPicture : Picture 
{ 
    // ... 
} 

然後學校實體引用SchoolPicture和學生實體引用的StudentPicture:

public class School 
{ 
    // ... 
    public virtual ICollection<SchoolPicture> Pictures {get;set;} 
} 
public class Student 
{ 
    // ... 
    public virtual ICollection<StudentPicture> Pictures {get;set;} 
} 

通過這種方式,兩個獨立的表的照片創建只有一個單一的外鍵對應的父實體:

Created model

+0

謝謝是的,我想這是實現這一點的最佳方式。但仍然不高興結束在數據庫中的兩個表來保存圖片.. – akd

+0

和在上下文類中我應該添加2個dbset一個爲SchoolPicture和一個爲StudentPicture是正確的? – akd

+0

是的,你需要添加兩個DbSets,但你只需要,如果你想直接訪問圖片添加這些;在我的示例中,我只添加了學校和學生的DbSets。有兩個獨立的實體的好處是,你不能意外地給學生分配一張SchoolPicture。 – Markus

0

在您的學生模型中,您說學生和圖片之間存在一對多的關係。與你的學校模型一樣的東西。因此,EF爲學生和學校模型添加了一個外鍵。這是預期的行爲。

對於我來說,在圖片 表中有這些外鍵是不正確的。

根據你的學生和學校模型,我期望EF爲圖片(StudentId和SchoolId)添加2個外鍵。它應該如何看待你?

今後如果其他實體都需要有照片的名單,然後 這意味着在圖片表中的另一外鍵屬性。

如果您創建另一個模型,其中包含ICollection <Picture> Pictures { get; set; }作爲屬性,那麼是的,這將在圖片中創建另一個外鍵。但是,如果你忽略它,它不會。

我不知道你在期待什麼。你能詳細說明嗎?

+0

想象一下,我已經添加了5個不同的實體圖片收藏。這意味着任何時候我添加一張圖片的外鍵的圖片表4必須設置爲空,因爲那些根本不相關。這對我來說聽起來不太好。我像@Markus描述的那樣去尋找多態性。 – akd

+0

啊,是的,明白了!是的,@ Markus解決方案可以解決這個問題 – kimbaudi

相關問題