一对一

采购申请订单——>采购订单
订单——>快递单
我将以订单——>快递单为例进行讲解。
一对一关系必须显示地在其中一个实体类中声明一个外键属性。
实体类:

1
2
3
4
5
6
7
8
9
10
11
12
public class Delivery {
public long Id { get; set; }
public string CampanyName { get; set; }
public string Number { get; set; }
public Order Order { get; set; }
public long OrderId { get; set; }//显式建立外键
}
public class Order {
public long Id { get; set; }
public string Name { get; set; }
public Delivery Delivery { get; set; }
}

配置类:

1
2
3
4
5
6
7
8
9
10
11
internal class DeliveryConfig : IEntityTypeConfiguration<Delivery> {
public void Configure(EntityTypeBuilder<Delivery> builder) {
builder.ToTable("T_Deliverys");
}
}
internal class OrderConfig : IEntityTypeConfiguration<Order> {
public void Configure(EntityTypeBuilder<Order> builder) {
builder.ToTable("T_Orders");
builder.HasOne<Delivery>(o=>o.Delivery).WithOne(d=>d.Order).HasForeignKey<Delivery>(d=>d.OrderId).IsRequired();//添加外键
}
}

Program.cs:

1
2
3
4
5
6
7
8
    static void Main(string[] args) {
using (var ctx = new MyDbContext()) {
Order o1 = new Order { Name = "手机" };
Delivery d1 = new Delivery { Number="0001", CampanyName ="顺丰快递",Order = o1 };
ctx.Deliveries.Add(d1);
ctx.SaveChanges();
}
}

多对多

老师——学生
EF Core 5.0开始正式支持多对多。
多对多必然产生中间表。
实体类:

1
2
3
4
5
6
7
8
9
10
11
12
public class Teacher
{
public long Id { get; set; }
public string Name { get; set; }
public List<Student> Student { get; set; } = new List<Student>();
}
public class Student
{
public long Id { get; set; }
public string Name { get; set; }
public List<Teacher> Teachers { get; set; } = new List<Teacher>();
}

配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
internal class TeacherConfig : IEntityTypeConfiguration<Teacher>
{
public void Configure(EntityTypeBuilder<Teacher> builder)
{
builder.ToTable("T_Teachers");
builder.HasMany(t => t.Student).WithMany(s => s.Teachers).UsingEntity(j => j.ToTable("T_Teachers_Students"));//最好指定一下中间表的表名
}
}
internal class StudentConfig : IEntityTypeConfiguration<Student>
{
public void Configure(EntityTypeBuilder<Student> builder)
{
builder.ToTable("T_Students");
}
}

Program.cs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    static void Main(string[] args) {
using (var ctx = new MyDbContext()) {
/*
var s1 = new Student { Name = "张三" };
var s2 = new Student { Name = "李四" };
var s3 = new Student { Name = "王五" };
var t1 = new Teacher { Name = "刘老师" };
var t2 = new Teacher { Name = "杨老师" };
var t3 = new Teacher { Name = "高老师" };
s1.Teachers.Add(t1);
s1.Teachers.Add(t2);
s2.Teachers.Add(t3);
s2.Teachers.Add(t1);
s3.Teachers.Add(t2);
ctx.Students.Add(s1);
ctx.Students.Add(s2);
ctx.Students.Add(s3);
ctx.SaveChanges();*/
var teachers = ctx.Teachers.Include(t => t.Student).ToList();
foreach (var teacher in teachers) {
Console.WriteLine(teacher.Name);
foreach (var student in teacher.Student) {
Console.WriteLine('\t'+student.Name);
}
}
}
}