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) 设置联级删除