繁体   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