如何使用流利的 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。
实体:学生、学科、班级。
- 1 个学生有多个科目。
- 1 个科目有几名学生参加。
- 1 教室可以开设多个科目的课程,并与所有参加 class 课程的学生相关,因此我们将有下图
所以这可以很容易地在一个单独的 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原则。
- 我在 windows 和 MySql 服务器上使用 Entity Framework 6。
不需要在"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,他为我指明了正确的方向。
更新
看来我没有让自己明白。我可能选错了问题。所以我会尝试另一个例子,希望能更好地说明我的问题。
新例子:犬种-疾病-药物。
描述
一个犬种可能会受到多种疾病的影响。
同一种疾病会影响多种犬种。
一种药物对特定犬种的一种或多种疾病有效
一种药对一只或多只狗治疗某种疾病有效
- 因此,药物有一个必要的成对列表,虽然每对应该是唯一的,但没有真正的关系键值,因为两个值可以重复。
代码
以下代码与 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。
实体:学生、学科、班级。
- 1 个学生有多个科目。
- 1 个科目有几名学生参加。
- 1 教室可以开设多个科目的课程,并与所有参加 class 课程的学生相关,因此我们将有下图
所以这可以很容易地在一个单独的 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原则。
- 我在 windows 和 MySql 服务器上使用 Entity Framework 6。
不需要在"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,他为我指明了正确的方向。