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这些操作大家都知道就不多说了,上结果)
又可以愉快地玩耍了
上一篇: MySQL索引失效问题
下一篇: btree索引和hash索引的区别