2017-04-04 64 views
0

我想定義關係,其中學生只能有一個最愛課程。我希望它看起來像這樣的DB:實體框架:無法定義1:1關係

STUDENT 
    ID  
    Name 
    FavoriteCourseID 
COURSE 
    ID 
    Name 

如何與實體框架實現這一目標?我寧願僅僅通過屬性來指定它。我想:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public Course FavoriteCourse { get; set; } 
    public int? FavoriteCourseID { get; set; } 
} 

public class Class 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

這給了我這個DB模式:

STUDENT 
    ID  
    Name 
    FavoriteCourseID 
COURSE 
    ID 
    Name 
    StudentID // how to remove this? 

注意,它可能會出現幾個同學有相同的最喜歡的課,因此,這是不能接受的解決方案。

另一個問題:這是什麼類型的關係? (1:1/1:N?)

+0

首先 - 目前還不清楚爲什麼你需要和身份證如果你有課程。第二 - 一個學生只能有0或1個班級,一個班級可以由任意數量的學生選擇 - 因此它應該是0..1到0..N這裏 –

+1

這是一對多的。而且我沒有在你的模型的'Course'表中得到'StudentID'(假設'Class'是'Course'),所以顯然這個張貼的模型是不完整的。 –

+1

@IvanStoev是的,我發佈的模型是不完整的。實體之間也有多對多的關係。我認爲問題與'FavoriteCourse'關係的定義有關。但事實證明,問題是,該實體框架沒有[正確識別關係](http://stackoverflow.com/questions/8228948/using-both-many-to-many-and-one-to-許多到相同的實體)。 – chriemmy

回答

1

要指定1對1關係,假定相關實體的主鍵與第一個實體的主鍵相匹配。你還應該指定一個virtual屬性相關實體:

public class Student 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public Course FavoriteCourse { get; set; } 
    public int? FavoriteCourseID { get; set; } 
} 

public class Class 
{ 
    [Key] 
    [ForeignKey("Student")] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual Student Student { get; set; } 
} 

這將是one-to-zero-or-one關係。檢查這個tutorial

如果您將標記FavouriteCourse財產與RequiredAttribute,它似乎,它會導致強大的一對一的關係。

這將導致足夠的數據庫結構:

STUDENT 
    ID  
    Name 
    FavoriteCourseID 
COURSE 
    ID 
    Name 

但是,如果許多學生能有一個最喜歡的課程,這種結構將是一個問題,因爲你想要一個一對多,而不是一對一-一。你會在數據庫中有重複的記錄,因爲一門課程可能只涉及一名學生。你必須考慮你的數據庫設計。

0

你可以試試這個:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("FavoriteCourseId")] 
    public Course FavoriteCourse { get; set; } 
    public int? FavoriteCourseId { get; set; } 
} 
0

通常情況下,您可以定義下列關係之一:

  1. 可選:可選
  2. 要求:可選
  3. 可選:許多
  4. 必需:許多
  5. 許多:許多

要求:要求不是通常的關係,插入具有這種關係的第一個條目需要特殊處理。

我假設你想要求:很多例如「每個學生有一個最喜歡的課程,但許多學生可能會選擇相同的最喜歡的課程」。