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

代码:

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

又可以愉快地玩耍了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值