该例子是我临时想出来的,不具有任何的实际意义。类图如图1所示。

图1

类代码:

[Table("student")]
public class Student
{
public int id { get; set; }
public string name { get; set; }
public int grade_id { get; set; }
public int address_id { get; set; } [NotMapped]
public Address address { get; set; } [NotMapped]
public List<Subject> subjects { get; set; }
[NotMapped]
public List<Teacher> teachers { get; set; } }

Student

[Table("teacher")]
public class Teacher
{
public int id { get; set; }
public string name { get; set; }
public int subject_id { get; set; }
public int depart_id { get; set; }
public int address_id { get; set; } [NotMapped]
public Address address { get; set; } [NotMapped]
public List<Student> students { get; set; } }

Teacher

[Table("grade")]
public class Grade
{
public int id { get; set; }
public string name { get; set; }
public int depart_id { get; set; }
[NotMapped]
public List<Student> students { get; set; } }

Grade

[Table("subject")]
public class Subject
{
public int id { get; set; }
public string name { get; set; }
public int depart_id { get; set; }
[NotMapped]
public List<Teacher> teachers { get; set; }
[NotMapped]
public List<Student> students { get; set; }
}

Subject

[Table("depart")]
public class Department
{
public int id { get; set; }
public string name { get; set; } [NotMapped]
public List<Address> addresses { get; set; }
[NotMapped]
public List<Grade> grades { get; set; }
[NotMapped]
public List<Subject> subjects { get; set; }
[NotMapped]
public List<Teacher> teachers { get; set; }
}

Department

[Table("address")]
public class Address
{
public int id { get; set; }
public string country { get; set; }
public string city { get; set; }
[NotMapped]
public List<Department> departs { get; set; } }

Address

类之间的关系如表1描述。

表1

Department与Grade, Subject, Teacher之间都是一对多的关系。以Teacher为例,Department与Teacher之间的对应关系是通过depart_id外键实现的,那么在构建Department模型时,该关系用代码描述为:

builder.Entity<Department>()
.HasMany(d => d.teachers)
.WithOne(t => t.depart).HasForeignKey(t => t.depart_id);

其中t=>t.depart可以省略,即

builder.Entity<Department>()
.HasMany(d => d.teachers)
.WithOne().HasForeignKey(t => t.depart_id);

Department与Address之间是多对多的关系,这种关系映射在数据库时通常需要有一张关系表,用于记录Department和Address之间的关系。同样地,要给这张关系表也建立一个相应的类:

[Table("depart_address")]
public class Depart_Address
{
public int id { get; set; }
public int depart_id { get; set; }
public int address_id { get; set; } [NotMapped]
public Department depart { get; set; }
[NotMapped]
public Address address { get; set; }
}

多对多的关系模型描述如下:

builder.Entity<Department>()
.HasMany(d => d.addresses)
.WithMany(a => a.departs)
.UsingEntity<Depart_Address>(
j => j.HasOne(pt => pt.address)
.WithMany().HasForeignKey(pt => pt.address_id),
j => j.HasOne(pt => pt.depart)
.WithMany().HasForeignKey(pt => pt.depart_id),
j => j.HasKey(t => new { t.depart_id, t.address_id }));

整段模型代码为:

protected override void OnModelCreating(ModelBuilder builder)
{
#region Student Relationships
// students-teachers : multi-to-multi
builder.Entity<Student>()
.HasMany(s => s.teachers)
.WithMany(t => t.students)
.UsingEntity<StudentTeacher>(
j => j.HasOne(pt => pt.teacher)
.WithMany()
.HasForeignKey(pt => pt.teacher_id),
j => j.HasOne(pt => pt.student)
.WithMany()
.HasForeignKey(pt => pt.student_id),
j => j.HasKey(t => new { t.student_id, t.teacher_id })); // students-subjects: multi-to-multi
builder.Entity<Student>()
.HasMany(s => s.subjects)
.WithMany(su => su.students)
.UsingEntity<StudentSubject>(
j => j.HasOne(pt => pt.subject)
.WithMany()
.HasForeignKey(pt => pt.subject_id),
j => j.HasOne(pt => pt.student)
.WithMany()
.HasForeignKey(pt => pt.student_id),
j => j.HasKey(t => new { t.student_id, t.subject_id })); // student-address: multi-to-one
builder.Entity<Student>()
.HasOne(s => s.address)
.WithMany()
.HasForeignKey(s => s.address_id);
#endregion #region Teacher Relationships
// teachers-address: multi-to-one
builder.Entity<Teacher>()
.HasOne(t => t.address)
.WithMany()
.HasForeignKey(t => t.address_id); builder.Entity<Teacher>()
.HasMany(t => t.students)
.WithMany(s => s.teachers)
.UsingEntity<StudentTeacher>(
j => j.HasOne(pt => pt.student)
.WithMany().HasForeignKey(pt => pt.student_id),
j => j.HasOne(pt => pt.teacher)
.WithMany().HasForeignKey(pt => pt.teacher_id),
j => j.HasKey(t => new { t.teacher_id, t.student_id }));
#endregion #region Department Relationships
// department-grades: one-to-multi
builder.Entity<Department>()
.HasMany(d => d.grades)
.WithOne().HasForeignKey(g => g.depart_id); // department-teachers: one-to-multi
builder.Entity<Department>()
.HasMany(d => d.teachers)
.WithOne().HasForeignKey(t => t.depart_id); // department-subjects: one-to-multi
builder.Entity<Department>()
.HasMany(d => d.subjects)
.WithOne().HasForeignKey(s => s.depart_id); // departments-addresses: multi-to-multi
builder.Entity<Department>()
.HasMany(d => d.addresses)
.WithMany(a => a.departs)
.UsingEntity<Depart_Address>(
j => j.HasOne(pt => pt.address)
.WithMany().HasForeignKey(pt => pt.address_id),
j => j.HasOne(pt => pt.depart)
.WithMany().HasForeignKey(pt => pt.depart_id),
j => j.HasKey(t => new { t.depart_id, t.address_id }));
#endregion #region Grade Relationships
// grade-students: one-to-multi
builder.Entity<Grade>()
.HasMany(g => g.students)
.WithOne().HasForeignKey(s => s.grade_id);
#endregion #region Subject Relationships
// subjects-students: multi-to-multi
builder.Entity<Subject>()
.HasMany(s => s.students)
.WithMany(stu => stu.subjects)
.UsingEntity<StudentSubject>(
j => j.HasOne(pt => pt.student)
.WithMany()
.HasForeignKey(pt => pt.student_id),
j => j.HasOne(pt => pt.subject)
.WithMany()
.HasForeignKey(pt => pt.subject_id),
j => j.HasKey(t => new { t.subject_id, t.student_id })); builder.Entity<Subject>()
.HasMany(s => s.teachers)
.WithOne().HasForeignKey(t => t.subject_id);
#endregion
}

OnModelCreating

测试:

1.构建Department对象

Department depart = context.departs
.Include(d => d.subjects)
.ThenInclude(s=>s.students)
.ThenInclude(s=>s.teachers)
.Include(d=>d.addresses)
.Include(d => d.teachers)
.ThenInclude(t=>t.students)
.Include(d => d.grades)
.ThenInclude(g => g.students).First();

Console.WriteLine("department name: " + depart.name);
Console.WriteLine();
Console.WriteLine("department subjects:");
foreach(var item in depart.subjects)
{
Console.WriteLine((depart.subjects.IndexOf(item)+1).ToString()+"." + item.name);
Console.WriteLine("Students choose this subject:");
foreach (var stu in item.students)
Console.Write(stu.name+",");
Console.WriteLine();
Console.WriteLine("Teachers who teach this subject:");
foreach (var t in item.teachers)
Console.Write(t.name+",");
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("department teachers:");
foreach(var item in depart.teachers)
{
Console.WriteLine((depart.teachers.IndexOf(item)+1).ToString()+"."+item.name);
Console.WriteLine("his or her students:");
foreach (var stu in item.students)
Console.Write(stu.name + ",");
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("department grades:");
foreach(var item in depart.grades)
{
Console.WriteLine((depart.grades.IndexOf(item) + 1).ToString() + "." + item.name);
Console.WriteLine("students in this grade:");
foreach (var stu in item.students)
Console.Write(stu.name + ",");
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("department addresses:");
foreach(var item in depart.addresses)
{
Console.WriteLine(item.country + "." + item.city);
}

Test depart

测试结果:

2.构建Students对象

List<Student> students = context.students
.Include(s => s.subjects)
.Include(s => s.teachers)
.Include(s => s.address).ToList();

Console.WriteLine("Students List:");
foreach(var item in students)
{
Console.WriteLine((students.IndexOf(item) + 1).ToString() + "." + item.name);
Console.WriteLine("his or her subjects:");
foreach(var sub in item.subjects)
{
Console.Write(sub.name + ",");
}
Console.WriteLine();
Console.WriteLine("his or her teachers:");
foreach (var t in item.teachers)
Console.Write(t.name + ",");
Console.WriteLine();
Console.WriteLine("his or her address:" + item.address.country + "." + item.address.city);
}

Test students

完整代码路径:

https://github.com/Larissa1990/EFcore_demo

举例说明EF CORE中模型之间的一对多、多对多关系的实现的更多相关文章

  1. EF Core中通过Fluent API完成对表的配置

    EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...

  2. EF Core中避免贫血模型的三种行之有效的方法(翻译)

    Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...

  3. EF Core中如何正确地设置两张表之间的关联关系

    数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...

  4. [小技巧]EF Core中如何获取上下文中操作过的实体

    原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...

  5. EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery

    一.目前EF Core的版本为V2.1 相比较EF Core v1.0 目前已经增加了不少功能. EF Core除了常用的增删改模型操作,Sql语句在不少项目中是不能避免的. 在EF Core中上下文 ...

  6. EF Core 中多次从数据库查询实体数据,DbContext跟踪实体的情况

    使用EF Core时,如果多次从数据库中查询一个表的同一行数据,DbContext中跟踪(track)的实体到底有几个呢?我们下面就分情况讨论下. 数据库 首先我们的数据库中有一个Person表,其建 ...

  7. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  8. 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)

    一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ...

  9. EF Core 配置模型

    0 前言 本文的第一节,会概述配置模型的作用(对数据模型的补充描述). 第二节描述两种配置方式,即:数据注释(data annotations)和 Fluent API 方式. 第三节开始,主要是将常 ...

随机推荐

  1. 搭建服务器之FTP

    FTP服务器,使用软件vsftpd,服务守护进程也是vsftpd.客户端访问的话可以用浏览器或ftp命令行. 1.yum install vsftpd.安装简单主要是配置,这个比httpd复杂点的地方 ...

  2. 总是记不住但又总是要用的css

    有没有经常遇到一些样式每次写都要用百度呢?我收集了一些我平时经常要用到的但又总是记不住的样式.有错误的地方欢迎指正.转载请注明出处. 一.设置input 的placeholder的字体样式 input ...

  3. python07day

    回顾 id == is: ==: 数值是否相同 is: 内存地址是否相同 id: 获取对象的内存地址 代码块: 一个文件.交互式命令一行都是一个代码块 同一代码块下缓存机制(字符串驻留机制) 所有数字 ...

  4. 解决matplotlib中文不显示问题

    在导入库时添加如下几行代码 from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcPa ...

  5. 随机UA

    from fake_useragent import UserAgent ua = UserAgent().random headers={ 'User-Agent':ua } print(heade ...

  6. Linux下的5种I/O模型与3组I/O复用

    引言 上一篇文章中介绍了一些无缓冲文件I/O函数,但应该什么时机调用这些函数,调用这些I/O函数时进程和内核的行为如何,如何高效率地实现I/O?这篇文章就来谈一谈Linux下的5种I/O模型,以及高性 ...

  7. 如何使用 numpy 和 pytorch 快速计算 IOU

    前言 在目标检测中用交并比(Interection-over-unio,简称 IOU)来衡量两个边界框之间的重叠程度,下面就使用 numpy 和 pytorch 两种框架的矢量计算方式来快速计算各种情 ...

  8. netty系列之:选byte还是选message?这是一个问题

    目录 简介 类型的定义 搭建UDT stream服务器 搭建UDT message服务器 Stream和Message的handler 总结 简介 UDT给了你两种选择,byte stream或者me ...

  9. Centos下安装配置WordPress与nginx教程

    感谢大佬:https://www.howtoing.com/how-to-install-wordpress-with-nginx-on-centos-6-2 WordPress是一个免费和开源网站和 ...

  10. SQL的多表查询(笛卡尔积原理)

    感谢大佬:https://blog.csdn.net/yang5726685/article/details/53538438 MySQL的多表查询(笛卡尔积原理) 先确定数据要用到哪些表. 将多个表 ...