EF Core 关系配置 一对多 双向导航属性
EF Core 支持一对多、多对对、一对一 关系。
一篇文章 Article 包含多条评论 Comment
Article(1)——》Comment(1,2,3...)
对于主从结构的“一对多”表关系,我们一般声明为双向导航属性,对于其它的“一对多”,则需根据情况决定使用单向导航属性还是双向导航属性。
例:被多个表都引用的基础表,一般都是声明单向导航属性。如用户,在采购单,入库单,表中都存在,关系不紧密,所以用单向导航。
实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | namespace EFCoreTest.Entities { /// <summary> /// 文章 /// </summary> public class Article { public long Id { get; set ; } /// <summary> /// 标题 /// </summary> public string Title { get; set ; } /// <summary> /// 内容 /// </summary> public string Content { get; set ; } /// <summary> /// 文章的评论 /// </summary> public List<Comment> Comments { get; set ; }=new List<Comment>(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using System.Text.Json.Serialization; namespace EFCoreTest.Entities { /// <summary> /// 评论 /// </summary> public class Comment { public long Id { get; set ; } /// <summary> /// 属于那篇文章 /// </summary> [JsonIgnore] public Article Article { get; set ; } public long ArticleId { get; set ; } /// <summary> /// 评论内容 /// </summary> public string Message { get; set ; } } } |
数据库表结构:
实体类的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace EFCoreTest.Config { public class ArticleConfig : IEntityTypeConfiguration<Article> { public void Configure(EntityTypeBuilder<Article> builder) { builder.ToTable( "T_Articles" ); //双向导航属性关系定义,此关系也可以在ArticleConfig配置文件设定,二先一 //builder.HasMany<Comment>(c => c.Comments).WithOne(a => a.Article); builder.Property(x => x.Content).IsRequired().IsUnicode(); builder.Property(x => x.Title).IsRequired().IsUnicode().HasMaxLength(255); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class CommentConfig : IEntityTypeConfiguration<Comment> { public void Configure(EntityTypeBuilder<Comment> builder) { builder.ToTable( "T_Comments" ); //一个Article包含多个Comments,即一篇文章包含多条评论。 //前部分HasOne声明Comment和Article的关系是一对一 //后部分WithMany声明Article和Comment的关系是一对多 //双向导航属性关系定义,此关系也可以在ArticleConfig配置文件设定,二先一 builder.HasOne<Article>(c => c.Article).WithMany(a => a.Comments) .IsRequired().HasForeignKey(c => c.ArticleId); builder.Property(c => c.Message).IsRequired().IsUnicode(); } } |
上下文配置文件 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class TestDbContext : DbContext { public TestDbContext(DbContextOptions options) : base(options) { } public DbSet<Article> Articles { get; set ; } public DbSet<Comment> Comments { get; set ; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.LogTo(Console.WriteLine); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //加载当前程序集中所有实现了IEntityTypeConfiguration<T> 接口的类 modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人