EntityFrameworkCore 一对一 && 一对多 && 多对多配置

基本数据结构

default
表设计如下:
入学记录

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);

参考资料:
https://www.learnentityframeworkcore.com/configuration/one-to-one-relationship-configuration

一对多

学生-班级

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);
示例代码

https://github.com/zLulus/NotePractice/blob/dev3/Website/DotNetCore/CoreWebsite.EntityFramework/WebsiteDbContext.cs

转载于:https://www.cnblogs.com/Lulus/p/9497874.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值