• Entity Framework Relationship 汇总


    关键词汇解释

    required / optional 必须 / 可空
    principal / dependent 表示哪个是主键表 / 表示哪个是外键表
    hasrequired / withrequired has表示的是正向的关系,则with表示的是反向关系
       

    数据加载

    如果用virtual关键字,则标识为该属性会懒加载(第一次用的时候加载)
    如果不用virtual关键字,则需要用include主动标识立即加载
    可以关闭懒加载:this.Configuration.LazyLoadingEnabled = false;

    一对一或一对零关系

       1: public class user
       2: {
       3:     public int id { get; set; }
       4:     public string code { get; set; }
       5:     public string name { get; set; }
       6: }
       7: public class dep
       8: {
       9:     public int id { get; set; }
      10:     public virtual user user { get; set; }
      11: }
      12: public class MyContext : DbContext
      13: {
      14:     protected override void OnModelCreating(DbModelBuilder modelBuilder)
      15:     {
      16:         modelBuilder.Entity<dep>()
      17:             .HasRequired(d => d.user)
      18:             .WithOptional();
      19:     }
      20: }

    说明:dep里user不能为空,user里不包含dep的导航

    如果改为:

       1: modelBuilder.Entity<dep>()
       2:                 .HasRequired(d => d.user)
       3:                 .WithRequiredDependent();

    则:两边都不能为空

    多对多关系

       1: public class user
       2: {
       3:    public int id { get; set; }
       4:    public string code { get; set; }
       5:    public string name { get; set; }
       6:    public virtual ICollection<dep> Deps { get; set; } 
       7: }
       8: public class dep
       9: {
      10:    public int id { get; set; }
      11:    public virtual ICollection<user> Users { get; set; }
      12: }
      13: public class MyContext : DbContext
      14: {
      15:    protected override void OnModelCreating(DbModelBuilder modelBuilder)
      16:    {
      17:        modelBuilder.Entity<dep>()
      18:            .HasMany(d => d.Users)
      19:            .WithMany(user => user.Deps);
      20:    }
      21: }

    这个简单,不解释

    一对多关系

       1: public class user
       2: {
       3:    public int id { get; set; }
       4:    public string code { get; set; }
       5:    public string name { get; set; }
       6:    public int DepId { get; set; }
       7:    public virtual dep Dep { get; set; }
       8: }
       9: public class dep
      10: {
      11:    public int id { get; set; }
      12:    public virtual ICollection<user> Users { get; set; }
      13: }
      14: public class MyContext : DbContext
      15: {
      16:    protected override void OnModelCreating(DbModelBuilder modelBuilder)
      17:    {
      18:        modelBuilder.Entity<user>()
      19:            .HasRequired(u => u.Dep)
      20:            .WithMany(d => d.Users)
      21:            .HasForeignKey(u => u.DepId)
      22:            .WillCascadeOnDelete(false);
      23:    }
      24: }

    说明:dep里包含多个user,user里包含一个dep,显示指定外键列为DepId(如果不指定,自动生成的数据库里外键列为Dep_id);

    WillCascadeOnDelete(false)表示不级联删除

    组合外键

       1: public class user
       2: {
       3:   public int id { get; set; }
       4:   public string code { get; set; }
       5:   public string name { get; set; }
       6:   public int DepId { get; set; }
       7:   public string DepCode { get; set; }
       8:   public virtual dep Dep { get; set; }
       9: }
      10: public class dep
      11: {
      12:   public int id { get; set; }
      13:   public string code { get; set; }
      14:   public virtual ICollection<user> Users { get; set; }
      15: }
      16: public class MyContext : DbContext
      17: {
      18:   protected override void OnModelCreating(DbModelBuilder modelBuilder)
      19:   {
      20:       modelBuilder.Entity<dep>().HasKey(d => new { d.id, d.code });
      21:  
      22:       modelBuilder.Entity<user>()
      23:           .HasRequired(c => c.Dep)
      24:           .WithMany(d => d.Users)
      25:           .HasForeignKey(d => new { d.DepId, d.DepCode });
      26:  
      27:   }
      28: }

    简单不解释

    重命名外键列

       1: modelBuilder.Entity<user>()
       2:                 .HasRequired(c => c.Dep)
       3:                 .WithMany(t => t.Users)
       4:                 .Map(m => m.MapKey("NewUserID"));
  • 相关阅读:
    硬盘安装CentOS 6.0(超级详细图文教程)
    js获取当前URL、域名、端口号
    前端匹配表情
    记一次复杂的数据转换
    浅拷贝与深拷贝
    js统计数组中元素的重复次数(二)
    js计算数组中某个元素重复出现的个数(一)
    移动端——处理rem根字体
    js实现简单的双向绑定
    JS正则截取两个字符串之间的字符串
  • 原文地址:https://www.cnblogs.com/wangcl/p/2564147.html
Copyright © 2020-2023  润新知