基本数据结构



表设计如下:

入学记录

public class AdmissionRecord
{
[Key]
public long Id { get; set; }
public DateTime AdmissionTime { get; set; }
public string Remark { get; set; }
}

班级

public class Class
{
[Key]
public long Id { get; set; }
public DateTime CreationTime { get; set; }
public string ClassName { get; set; }
public virtual List<Student> Students { get; set; }
}

学生-教师关系表

public class StudentTeacherRelationship
{
[Key]
public long Id { get; set; }
public long StudentId { get; set; }
public virtual Student Student { get; set; }
public long TeacherId { get; set; }
public virtual Teacher Teacher { get; set; }
}

教师

public class Teacher
{
[Key]
public long Id { get; set; }
public string Name { get; set; }
public string TeacherId { get; set; }
public virtual List<StudentTeacherRelationship> StudentTeacherRelationships { get; set; }
}

学生

public class Student
{
[Key]
public long Id { get; set; }
public string StudentId { get; set; }
public string Name { get; set; }
public long AdmissionRecordId { get; set; }
//Student-AdmissionRecord 1:1
[ForeignKey("AdmissionRecordId")]
public virtual AdmissionRecord AdmissionRecord { get; set; }
public long ClassId { get; set; }
public virtual Class Class { get; set; }
public virtual List<StudentTeacherRelationship> StudentTeacherRelationships { get; set; }
}

一对一

学生-入学记录

public long AdmissionRecordId { get; set; }
//Student-AdmissionRecord 1:1
[ForeignKey("AdmissionRecordId")]
public virtual AdmissionRecord AdmissionRecord { get; set; }

另解

modelBuilder.Entity<Student>()
.HasOne(p => p.AdmissionRecord)
.WithOne(p => p.Student)
.HasForeignKey<Student>(p => p.AdmissionRecordId);

参考资料:

Configuring One To One Relationships In Entity Framework Core

一对多

学生-班级

modelBuilder.Entity<Class>()
.HasMany(p => p.Students)
.WithOne(p => p.Class)
.HasForeignKey(p => p.ClassId)
.OnDelete(DeleteBehavior.ClientSetNull);
//下面写法也可以
//modelBuilder.Entity<Student>()
// .HasOne(p => p.Class)
// .WithMany(p=>p.Students)
// .HasForeignKey(k => k.ClassId)
// .OnDelete(DeleteBehavior.ClientSetNull);

多对多

学生-教师

//通过StudentTeacherRelationship中间表,通过实现两个1:n,实现m:n
modelBuilder.Entity<StudentTeacherRelationship>()
.HasOne(p => p.Student)
.WithMany(p => p.StudentTeacherRelationships)
.HasForeignKey(k => k.StudentId)
.OnDelete(DeleteBehavior.ClientSetNull); modelBuilder.Entity<StudentTeacherRelationship>()
.HasOne(p => p.Teacher)
.WithMany(p => p.StudentTeacherRelationships)
.HasForeignKey(k => k.TeacherId)
.OnDelete(DeleteBehavior.ClientSetNull);

示例代码

示例代码

EntityFrameworkCore 一对一 && 一对多 && 多对多配置的更多相关文章

  1. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置

    n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...

  3. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  4. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  5. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  6. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置

    1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...

  7. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  8. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  9. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

随机推荐

  1. iOS开发Quartz2D之 七:雪花效果

    #import "VCView.h" @implementation VCView -(void)awakeFromNib { //[NSTimer scheduledTimerW ...

  2. jquery-11 如何实现标签的鼠标拖动效果

    jquery-11 如何实现标签的鼠标拖动效果 一.总结 一句话总结:核心原理:1.标签实现绝对定位,位置的话跟着鼠标走.2.点击标签的话,给标签绑定事件,停止按住鼠标的话,解除绑定的事件. 1.事件 ...

  3. 【40.17%】【codeforces 569B】Inventory

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. PatentTips - 在物联网中进行数据过滤的方法和装置

    背景技术 [0001] 本发明涉及物联网,特别涉及在物联网进行数据过滤的方法和装置. [0002] 物联网是新一代信息技术的重要组成部分,特指物物相连的网络.具体地,物联网是指通过各种信息传感设备,如 ...

  5. 文件上传api——MultipartFile

    MultipartFile 方法总结  byte[] getBytes() 返回文件的内容作为一个字节数组.  String getContentType() 返回文件的内容类型.  InputStr ...

  6. JSON 表达式

    JSON语法规则:     数据在名称/值对中:     数据由逗号分隔:     大括号保存对象:     中括号保存数组 1.访问对象值: var myObj,x; myObj = {" ...

  7. [Ramda] Refactor to Point Free Functions with Ramda using compose and converge

    In this lesson we'll take some existing code and refactor it using some functions from the Ramda lib ...

  8. 【iOS】怎样推断文本文件的字符编码格式

    整体思路: 遍历全部的字符编码.能正确读取输出转换的就是文本文件的编码格式. 代码例如以下: // // main.m // 检測文本字符编码格式的小技巧 // // Created by 杜子兮 ( ...

  9. [自学AndroidStudio系列]第二篇章:高速上手AS小技巧其一

    事实上看过第一篇的文章的人可能发现了,这个系列实际上是针对,有android开发经验的,之前使用Eclipse的开发人员;所以,避免无谓的口舌,直接进入说重点吧; 关闭项目自己主动打开 AS会自己主动 ...

  10. Linux网络编程——原始套接字能干什么?

    通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用: (2)数据报式套接字(SOCK ...