如何使用流利的 API 在 MVC Entity Framework C# 中(首先)编写以下三元关系?

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

更新

看来我没有让自己明白。我可能选错了问题。所以我会尝试另一个例子,希望能更好地说明我的问题。

新例子:犬种-疾病-药物。

描述

代码

以下代码与 EF 一起正常工作,在 DogBreed 和 Disease 之间创建查找 table,如下图所示:

[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; }
}

问题

我想知道如何将实体药物添加到我的项目中,并让EF生成下图所示的方案。

代码可能是这样的:

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

但这并没有生成想要的方案。我该如何进行?

我想澄清一下,我的疑问是如何让代码在我的数据库中自动生成我想要的结构,以便我可以无缝地使用 entity framework 功能,因此所有解决方案暗示在数据库上手动创建 table 或更改结构(即定义新的 class)已被考虑。我不是在寻找关于如何绕过这个问题的建议。


旧解释

我有一个简单的三元关系,其中三个实体相互关联,如下面在针对我的特定问题弥补的示例中所述。问题是我不知道如何输入代码,以在我的数据库中获取我期望的 tables。

实体:学生、学科、班级。

所以这可以很容易地在一个单独的 table 中关联起来,它将三个关联如下,其中学生 1 将在 class 房间 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;
}

在这种情况下,当我 运行 添加迁移和更新数据库时,我得到一个 table studentsubject,它包含两个实体的 id,并自动关联多对多关系。

那么,如果可能的话,如果关系是为了获得具有 3 个字段的中间 table,那么编写 classes 的方法是什么?.集合、属性、classes 词典...?

-我的示例的真正设计是在第一个列表中添加以下 class:

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

暂时我会创建一个class来表示三元关系,虽然我觉得这不符合KISS原则。

不需要在"Classroom"对象中直接提到"Students",因为它有一个"subjects"的列表,而"subject"本身有一个[=30=的列表]

这是错误的:

public KeyValuePair<Student, Subject> StudentSubject;

这意味着在 "Subject" 对象中将 Student 插入主题一次,在课堂中插入一次 "Again",为什么?!

你必须有这样的东西,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();

经过一段时间的寻找和等待,回到学校后:

根据定义,规范化良好的关系是二元关系。因此,示例中描述的三元关系不适用于 code first,但是这种关系的性质决定了形成它的二元关系(狗品种 - 医学,医学 - 疾病,狗品种 - 疾病)重要到足以自己形成实体。

根据你的问题,你应该只选择一个来组成一个实体。所以这个问题的答案是...

要利用 entity framework 和先编码,为了编码三元关系,您必须使两个部分之间的关​​系成为一个实体本身。

[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,他为我指明了正确的方向。