欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EF core 建立多对多表关联关系的方法,记录一下刨坑历程

程序员文章站 2024-01-20 18:49:46
...

代码:

表1:PersonalizedBill

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace Management.core.Models
{
    public class PersonalizedBill
    {
     //上面的一些字段省略了,因为是在做项目
        public ICollection<PartRelation> partRelations { get; set; }//这里很重要
    }
}

表2:PartAgreement

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;


namespace Management.core.Models
{
    public class PartAgreement
    {
        
         //上面的一些字段也省略了,原因同上
       public ICollection<PartRelation> partRelations { get; set; }
    }
}

表3:PartRelation(这个类用来映射关联表)

using System;
using System.ComponentModel.DataAnnotations;

namespace Management.core.Models
{
   public class PartRelation
    {
        public Guid Id { get; set; }
        public Guid PersonalBillId { get; set; }
        public Guid PartAgreementId { get; set; }
  
    }
}

重要的地方来了:我通过表1和表2分别与关联表建立一对多的关系

using Management.core.Models;
using Microsoft.EntityFrameworkCore;

namespace Management.core.DB
{
    public class LbtContext : DbContext
    {
        public DbSet<PersonalizedBill> PersonalizedBills { get; set; }
        public DbSet<PartAgreement> PartAgreements { get; set; }
        public LbtContext(DbContextOptions<LbtContext> options) : base(options) { }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            builder.Entity<PersonalizedBill>(b =>
               {
                   b.HasMany(e => e.partRelations)
                         .WithOne()
                         .HasForeignKey(Pa => Pa.PersonalBillId)
                         .HasPrincipalKey(Pb => Pb.Id)
                         .OnDelete(DeleteBehavior.ClientSetNull);
               });

            builder.Entity<PartAgreement>(b =>
            {
                b.HasMany(e => e.partRelations)//通过零件表的partRelations可以找到多个关联行
                      .WithOne()//设置PartAgreement实体通过属性partRelations可以找到一个PartAgreement实体,表示关联行表是一对多关系中的从表
                      .HasForeignKey(Pa => Pa.PartAgreementId)//设置关联行的PartAgreementId为一对多关系中的从表外键
                      .HasPrincipalKey(Pb => Pb.Id)//设置PartAgreement表的Id列为一对多关系中的主表键
                      .OnDelete(DeleteBehavior.ClientSetNull);//设置一对多关系的级联删除效果为DeleteBehavior.ClientSetNull
            });

        }
    }
}

然后迁移(Add-Migration,update-database这些操作大家都知道就不多说了,上结果)
EF core 建立多对多表关联关系的方法,记录一下刨坑历程
又可以愉快地玩耍了