EntityFrameworkCore 一对一 && 一对多 && 多对多配置
基本数据结构

表设计如下:
入学记录
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 一对一 && 一对多 && 多对多配置的更多相关文章
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- mybatis的执行流程 #{}和${} Mysql自增主键返回 resultMap 一对多 多对一配置
n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的运行环境等信息. Mapper.xml文件即Sql映射文件,文件中配置了操作数据库的Sql语句.此文件需要在 ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置
1.Mybatis多表查询1.1 一对一查询1.1.1 一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的 ...
- 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
随机推荐
- Hadoop配置文件 分类: A1_HADOOP 2014-08-19 12:48 1157人阅读 评论(1) 收藏
部分内容参考:http://www.linuxqq.net/archives/964.html http://slaytanic.blog.51cto.com/2057708/1100974/ ha ...
- 【p091】多项式输出
一元 n 次多项式可用如下的表达式表示: 其中,aixi 称为i次项,ai称为i次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 多项式中自变量为x,从左到右按照 ...
- ArcSDE中Compress与Compact的区别
原文 ArcSDE中Compress与Compact的区别 附件一”为两种数据库需要的管理工作. 与所表示的含义与操作是不同的. 对于来说,Compressing与Smart Dat ...
- js如何使用正则表达式验证电话号码(可选区号)和邮箱?(分步骤)
js如何使用正则表达式验证电话号码(可选区号)和邮箱?(分步骤) 一.总结 js进阶正则表达式16电话号码和邮箱正则(分类解决邮箱验证)(分组加?解决电话号码区号选择问题)([\w\.-]中括号解决邮 ...
- [NPM] Run npm scripts in series
After creating several npm script it becomes useful to run multiple scripts back-to-back in series. ...
- jdk8-collect
toMap 常用方式 public Map<Long, String> getIdNameMap(List<Account> accounts) { return accoun ...
- Vue Router的官方示例改造
基于Vue Router 2018年8月的官方文档示例,改造一下,通过一个最简单的例子,解决很多初学者的一个困惑. 首先是官方文档示例代码 <!DOCTYPE html> <html ...
- 改变浏览器中默认的ctrl+s方法
在一般的情况下,我们在浏览网页的时候按下ctrl+s,浏览器会弹出一个保存网页的框. 但是在一些特定的网页中,我们希望ctrl+s不是弹出默认的保存窗口,而是进行一下别的操作. 比如在我们使用简书的时 ...
- Fast exit from dram self-refresh
Embodiments of the invention describe a dynamic random access memory (DRAM) device that may abort a ...
- Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...