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