簡體   English   中英

如何使用流暢的API在MVC實體框架C#中編寫(第一個)以下三元關系?

[英]How to code (first) the following ternary relationship in MVC Entity Framework C# with fluent API?

UPDATE

看來我沒有讓自己明白。 我可能錯誤地選擇了問題。 所以我將嘗試另一個例子,希望能夠更好地說明我的問題。

新例子: 狗品種 - 疾病 - 醫學。

描述

  • 狗的品種可能受到幾種疾病的影響。

  • 同一種疾病可以影響幾種犬種。

  • 對於某種狗品種,一種葯對一種或多種疾病有效

  • 一種葯對一種或多種治療某種疾病的狗有效

    • 因此,葯物具有必需的對的列表,並且盡管每對應該是唯一的,但是沒有真正的關系鍵值,因為兩個值都可以重復。

以下代碼可以正常使用EF在DogBreed和Disease之間創建查找表,如下圖所示:

[Table("dog_breed")]
public DogBreed (){
    public int ID { get;set; }
    public string DogBreedName { get;set; }
    public IList<Disease> Diseases { get; set; }
}

[Table("disease")]
public Disease (){
    public int ID { get;set; }
    public string DiseaseName { get;set; }
    public IList<DogBreed> DogBreeds { get; set; }
}

DogBreed與疾病之間存在多種關系

問題

我想知道如何將實體葯物添加到我的項目中,如下所示,並獲得EF生成下圖中顯示的方案。

代碼可能是這樣的:

[Table("medicine")]
public Medicine (){
    public int ID { get;set; }
    public string MedicineName { get; set; }
    public Lookup<DogBreed,Disease> { get;set; }
}

許多與許多三元關系

但這並不會產生所需的方案。 我該怎么辦?

我想澄清一下,我的疑問是如何使代碼自動生成我想要的數據庫結構,這樣我就可以無縫地使用實體框架功能,因此所有解決方案都意味着手動在數據庫上創建表,或者改變結構(已經考慮過,即定義一個新的類。 我不是在尋找如何繞過這個問題的建議。


舊解釋

我有一個簡單的三元關系,其中三個實體相關,正如我在下面描述的一個例子中為我的具體問題做了解釋。 問題是我不知道如何鍵入代碼,以獲得我期望它們在我的數據庫中的表。

實體:學生,科目,課堂。

  • 1學生有幾門科目。
  • 1名學生參加了1個科目。
  • 1個課堂可以為幾個科目提供課程,也可以與所有參加課程的學生相關,這樣我們就可以得到以下圖表

關系圖

因此,這可以很容易地在一個單獨的表格中相關聯,該表格將如下三個相關聯,其中學生1將在課堂2中學習主題13的課程。

關系表

這是我在以下列方式編碼時觀察到的二元關系的行為:

[Table("student")]
public class Student
{
[Key]
public int ID {get; set;}
public List<Subject> Subjects;
}

[Table("subject")]
public class Subject
{
[Key]
public int ID {get; set;}
public List<Student> Students;
}

在這種情況下,當我運行Add-Migration和Update-Database時,我得到一個表studentsubject,其中包含兩個實體的id,並自動關聯多對多關系。 表EF僅針對兩個實體之間的多對多關系自動生成

那么,如果可能的話,如果要獲得具有3個字段的中間表的關系,那么對類進行編碼的方法是什么? 收藏,屬性,班級詞典......?

- 我的例子的真實設計是在第一個列表中添加以下類:

[Table("classroom")]
public class Classroom
{
[Key]
public int ID {get; set;}
public KeyValuePair<Student, Subject> StudentSubject;
}
  • 數據庫的任何其他配置都會獲得重復數據。
  • 字典值不起作用(加上,它不正確,因為它與實體的真實含義不匹配,因為在三者之間的現實世界中沒有真正的鍵值關系)
  • 在我真正的問題中,學生將有一個主題列表,一個主題列出學生。 然后我將單獨定義課堂,並通過學生主題的獨特組合來識別。

暫時我將創建一個代表三元關系的課程,雖然我覺得這不符合KISS原則。

  • 我在Windows和MySql Server上使用Entity Framework 6。

沒有必要直接在“課堂”對象中提及“學生”,因為它有一個“科目”列表和“科目”本身有一個“學生”列表

這是錯的:

public KeyValuePair<Student, Subject> StudentSubject ;

這意味着在“主題”對象中插入一次學生主題一次,在課堂中插入一次“再次”,為什么?!

你必須有這樣的東西,EF會做出神奇的事:

[Table("classroom")] public class Classroom { [Key] public int ID {get; set;} public List<Subject> Subject; }

每個科目都是您每個課堂的學生

List<Student> classroomSubjectStudents = classroom.Subjects .Where(x=>x == someSubject) .Select(x=>x.Students).ToList();

經過一段時間的搜索並等待一段時間后,我又回到了學校,並且:

根據定義,良好規范化的關系是二元關系。 因此,示例中描述的三元關系不會首先代碼一起使用,然而關系的本質使得形成它的二元關系(狗品種 - 醫學,醫學 - 疾病,狗品種 - 疾病)重要到足以形成實體他們自己的。

根據您的問題,您應該選擇一個來形成一個實體。 所以這個問題的答案是......

要首先利用實體框架和代碼,為了編寫三元關系,您必須將兩個部分之間的關​​系作為實體本身。

[Table("dog_breed")]
public DogBreed (){
    public int ID { get; set; }
    public string DogBreedName { get; set; }
    public List<PairMedicineDisease> PairsMedicineDisease { get; set; }
}


[Table("medicine")]
public Medicine (){
    public int ID { get;set; }
    public string MedicineName { get;set; }
}

[Table("disease")]
public Disease (){
    public int ID { get;set; }
    public string DiseaseName { get;set; }
}

[Table("pair_medicine_disease")]
public PairMedicineDisease (){
    public int ID { get;set; }
    public Disease Disease { get;set; }
    public Medicine Medicine { get;set; }
}

感謝所有試圖提供幫助的人,特別感謝@ Gert Arnold ,他指出了我正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM