EF 导航属性 手动指定关系

public class A
{
    public int Id {get;set;}           //数字型,主键,相关自增ID号
    public string aStr{get;set;}  //字符型主键,唯一性
    public B b {get;set;}           //A对B,一对一
}

public class B
{
    public int Id {get;set;}                    //数字型,主键,相关自增ID号
    public int aId {get;set;}                   //数字型,外键,指向A.Id 字段
    public string bStr{get;set;}           //字符型主键,唯一性
    public string aStr {get;set;}          //字符型外键,指向A.aStr 字段
    public ICollection<C> cs {get;set;} //B对C,一对多
}

public class C
{
    public int Id {get;set;}             //数字型,主键,自增ID号
    public int bId {get;set;}           //数字型,外键,指向B.Id 字段
    public string bStr {get;set;}    //字符型,外键,指向B.bStr 字段
}                

以上是基础表结构

 

A表与B表,是一对一关系

B表与C表,是一对多关系

 

声明关系

protected override void OnModelCreating(ModelBuilder modelBuilder)
{

//指定A表与B表为一对一关系,并指定B表的aId为外键
modelBuilder.Entity<A>().HasOne<B>(p => p.b).WithOne().HasForeignKey<B>(fk => fk.aId);


//指定B表与C表为一对多关系,并指定B表的bStr为主键,C表的bStr为外键
modelBuilder.Entity<B>().HasOne<C>(p => p.cs).WithOne().HasPrincipalKey<B>(fk => fk.bStr).HasForeignKey<C>(fk => fk.bStr);

//如果使用自增主键为主键
modelBuilder.Entity<B>().HasOne<C>(p => p.cs).WithOne().HasForeignKey<C>(fk => fk.bId);

}

以自增主键为表关系主键,则只需要指定外键即可,如果是非自增主键为表关系主键,则需要声明哪个为关系主键

此设置支持(代码级)联级删除

这种设置,是在代码里进行设置,数据库可以不需要建立主键与外键的关系,也没有联级绑定,比较灵活。

 

这里多对多的关系,还没有说明,以后有时间再来写:)

 

//手动设置联级删除

modelBuilder.Entity<B>().HasOne<C>(p => p.cs).WithOne().HasForeignKey<C>(fk => fk.bId).IsRequired(false).OnDelete(DeleteBehavior.Cascade);

 IsRequired(false) 非必须

 OnDelete(DeleteBehavior.Cascade) 设置联级删除

 

posted @ 2020-11-06 10:57  delafqm  阅读(297)  评论(0编辑  收藏  举报