该例子是我临时想出来的,不具有任何的实际意义。类图如图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. vue学习4-class和sytle绑定

    #### Class绑定: 1. 通过数组的方式来实现: 2. 通过对象的方式来实现: 通过对象: 通过数组,通过数组是把多个style样式对象添加进去:

  2. linux 创建用户 用户组,sudo,禁止root远程ssh登录

    创建用户  useradd hanli 为新用户设置密码(在root下可以为普通用户重置密码)  passwd hanli 创建用户组  groupadd  op 将用户添加到用户组  usermod ...

  3. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  4. Sklearn 与 TensorFlow 机器学习实用指南第二版

    零.前言 一.机器学习概览 二.一个完整的机器学习项目 三.分类 四.训练模型 五.支持向量机 六.决策树 七.集成学习和随机森林 八.降维 十.使用 Keras 搭建人工神经网络 十一.训练深度神经 ...

  5. JDBC 操作预编译语句中LIKE模糊匹配怎么用

    问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%._呢. 如: SELECT * FROM "+LQ_USERS+" ...

  6. SpringBoot+Dubbo+ZooKeeper+Maven入门实践

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11798626.html 注*** 本实例为仅适合初学者,关于dubbo和springboot以 ...

  7. 剑指Offer系列_30_包含min函数的栈

    以空间换时间: package leetcode.sword_to_offfer.day01; import java.util.Stack; /** * 定义栈的数据结构,请在该类型中实现一个能够得 ...

  8. HTML笔记整理--下节

    欢迎来到HTML基础笔记下节部分! 内联样式 当特殊的样式需要应用到个别元素时,就可以使用内联样式. 使用内联样式的方法是在相关的标签中使用样式属性.样式属性可以包含任何 CSS 属性.以下实例显示出 ...

  9. if,for,while,do...while

    顺序结构 java的基本结构就是顺序结构,除法特别指明,否则就按照顺序一句一句执行 顺序结构是最简单的算法结构 语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干依次执行的处理步骤组成, ...

  10. 私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境.使软件产品能够快速迭代. 在之前部署 ...