一、一对多
public class Article { public long Id { get; set; }//主键 public string Title { get; set; }//标题 public string Content { get; set; }//内容 public List<Comment> Comments { get; set; } = new List<Comment>(); //此文章的若干条评论 }
public class Comment { public long Id { get; set; } public Article Article { get; set; }//导航属性 public long ArticleId { get; set; }// 声明ArticleId是考虑到有时候不连表查询且需要查询ArticleId public string Message { get; set; } }
1、配置
class ArticleConfig : IEntityTypeConfiguration<Article> { public void Configure(EntityTypeBuilder<Article> builder) { builder.ToTable("T_Articles"); builder.Property(a => a.Content).IsRequired().IsUnicode(); builder.Property(a => a.Title).IsRequired().IsUnicode().HasMaxLength(255); } }
class CommentConfig : IEntityTypeConfiguration<Comment> { public void Configure(EntityTypeBuilder<Comment> builder) { builder.ToTable("T_Comments"); builder.HasOne<Article>(c => c.Article).WithMany(a => a.Comments)//这里使用的双向导航属性。如何使用单向导航属性:HasOne<Article>(t=>t.Article).WithMany() .IsRequired().HasForeignKey(c => c.ArticleId);//不指定HasForeighKey,数据库中会生成两个ArticleId builder.Property(c => c.Message).IsRequired().IsUnicode(); } }
2、数据插入
using MyDbContext ctx = ew MyDbContext(); Article a1 = new Article(); a1.Title="TESIJTISJIOT"; a1.Content="jsdfiiiiiiiiiiiiiiiiiiiiiiiCONTiejwqitoniosjfiosadnvocijiotads----"; Comment c1 = new Comment{Message="niubi"}; Comment c2 = new Comment{Message="tailnisjfis"} a1.Comments.Add(c1); a1.Comments.Add(c2); ctx.Articles.Add(a1); ctx.SaveChanges();
3、数据获取
using MyDbContext ctx = new MyDbContext(); Airticle a= ctx.Articles.Include(a-=>a.Comments).Single(a=>a.ID==1); Console.WriteLine(a.Title);
foreach(Comment c in a.Comments) { Console.WriteLine(c.Id + ":" + c.Message); }
using MyDbContext ctx = new MyDbContext(); var cs= ctx.Comments.Include(a-=>a.Airticle).Where(a=>a.AirticleId==1).ToList(); foreach(Comment c in cs) { Console.WriteLine(c.Airticle.Title); Console.WriteLine(c.Id + ":" + c.Message); }
二、一对一
class Delivery { public long Id { get; set; } public string CompanyName { get; set; }//快递公司名 public String Number { get; set; }//快递单号 public Order Order { get; set; }//订单 public long OrderId { get; set; }//指向订单的外键 } class Order { public long Id { get; set; } public string Name { get; set; }//商品名 public string Address { get; set; }//收货地址 public Delivery? Delivery { get; set; }//快递信息 }
1、配置
class DeliveryConfig : IEntityTypeConfiguration<Delivery> { public void Configure(EntityTypeBuilder<Delivery> builder) { builder.ToTable("T_Deliveries"); builder.Property(d => d.CompanyName).IsUnicode().HasMaxLength(10); builder.Property(d => d.Number).HasMaxLength(50); } }
class OrderConfig : IEntityTypeConfiguration<Order> { public void Configure(EntityTypeBuilder<Order> builder) { builder.ToTable("T_Orders"); builder.Property(o => o.Address).IsUnicode(); builder.Property(o => o.Name).IsUnicode(); builder.HasOne<Delivery>(o => o.Delivery).WithOne(d => d.Order) .HasForeignKey<Delivery>(d => d.OrderId); } }
2、数据插入
using TestDbContext ctx = new TestDbContext(); Order order = new Order(); order.Address = "北京市海淀区中关村南大街999号"; order.Name = "USB充电器"; Delivery delivery = new Delivery(); delivery.CompanyName = "蜗牛快递"; delivery.Number = "SN333322888"; delivery.Order = order; ctx.Deliveries.Add(delivery); await ctx.SaveChangesAsync();
3、数据获取
Order order1 = await ctx.Orders.Include(o => o.Delivery) .FirstAsync(o => o.Name.Contains("充电器")); Console.WriteLine($"名称:{order1.Name},单号:{order1.Delivery.Number}");
三、多对多
class Student { public long Id { get; set; } public string Name { get; set; } public List<Teacher> Teachers { get; set; } = new List<Teacher>(); } class Teacher { public long Id { get; set; } public string Name { get; set; } public List<Student> Students { get; set; } = new List<Student>(); }
1、配置
class StudentConfig : IEntityTypeConfiguration<Student> { public void Configure(EntityTypeBuilder<Student> builder) { builder.ToTable("T_Students"); builder.Property(s => s.Name).IsUnicode().HasMaxLength(20); builder.HasMany<Teacher>(s => s.Teachers).WithMany(t => t.Students) .UsingEntity(j => j.ToTable("T_Students_Teachers")); } } class TeacherConfig : IEntityTypeConfiguration<Teacher> { public void Configure(EntityTypeBuilder<Teacher> builder) { builder.ToTable("T_Teachers"); builder.Property(s => s.Name).IsUnicode().HasMaxLength(20); } }
2、数据插入
Student s1 = new Student { Name = "tom" }; Student s2 = new Student { Name = "lily" }; Student s3 = new Student { Name = "lucy" }; Student s4 = new Student { Name = "tim" }; Student s5 = new Student { Name = "lina" }; Teacher t1 = new Teacher { Name = "杨中科" }; Teacher t2 = new Teacher { Name = "罗翔" }; Teacher t3 = new Teacher { Name = "刘晓艳" }; t1.Students.Add(s1); t1.Students.Add(s2); t1.Students.Add(s3); t2.Students.Add(s1); t2.Students.Add(s3); t2.Students.Add(s5); t3.Students.Add(s2); t3.Students.Add(s4); using TestDbContext ctx = new TestDbContext(); ctx.AddRange(t1, t2, t3); ctx.AddRange(s1, s2, s3, s4, s5); await ctx.SaveChangesAsync();
3、数据获取
using TestDbContext ctx = new TestDbContext(); foreach (var t in ctx.Teachers.Include(t => t.Students)) { Console.WriteLine($"老师{t.Name}"); foreach (var s in t.Students) { Console.WriteLine($"---{s.Name}"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下