学海无涯

导航

统计

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

  

 

posted on   宁静致远.  阅读(510)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示