当前位置 博文首页 > lbttwo的博客:EF core 建立多对多表关联关系的方法,记录一下刨

    lbttwo的博客:EF core 建立多对多表关联关系的方法,记录一下刨

    作者:[db:作者] 时间:2021-08-30 15:57

    代码:

    表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这些操作大家都知道就不多说了,上结果)

    又可以愉快地玩耍了

    cs