10.Configure One-to-Many(配置一对多关系)【Code-First系列】

现在,我们将学习怎么配置一对多的关系。

Visit Entity Relationship section to understand how EF manages one-to-one, one-to-many, and many-to-many relationships between the entities.

Note: You do not need to configure for one-to-many relationships either using DataAnnotations or Fluent API, if entity classes follow the conventions.

请注意;如果你是按照默认的约定来命名属性的话,不用手动配置一对多的关系,因为Code-First默认约定,会自动帮我们搞定。

一、使用数据注解特性来,配置一对多的关系

 

先来看看,使用默认的约定,Code-First自动帮我们配置一对多的关系的例子吧:

Standard班级表,Student学生表,一个班级有多个学生,一个学生只能属于一个班级

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class Student
    {
       public int StudentId { get; set; }

       public string StudentName { get; set; }

       public virtual Standard Standard { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EF6
{
   public class Standard
    {
       public int StandardID { get; set; }

       public string Description { get; set; }

       public virtual ICollection<Student> Students { get; set; }

    }
}
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class DbContextClass:DbContext
    {
       public DbContextClass()
           : base("name=ConnectionString") 
       { 
       
       }

       public DbSet<Student> Students { get; set; }

       public DbSet<Standard> Standards { get; set; }


    }
}

然后运行程序,就自动生成数据库,我们看下默认约定,自动生成的数据库是啥样的:

上面的一对多的关系是Code-First默认帮我们搞定的。

It is recommended to include foreign key property in Student entity class. So, include StandardId as per default convention or use ForeignKey attribute to give a different name of the foreign key property. For example, the following code includes StandardRefId property for the foreign key.

现在我们来自己配置:

上面看到的外键名称,是默认生成的,我们现在自己弄个外键名字:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class Student
    {
       public int StudentId { get; set; }

       public string StudentName { get; set; }

       public int StandardRefID { get; set; }

       [ForeignKey("StandardRefID")]
       public virtual Standard Standard { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EF6
{
   public class Standard
    {
       public int StandardID { get; set; }

       public string Description { get; set; }

       public virtual ICollection<Student> Students { get; set; }

    }
}

二、使用Fluent API来配置一对多的关系:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class DbContextClass:DbContext
    {
       public DbContextClass()
           : base("name=ConnectionString") 
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }

       public DbSet<Standard> Standards { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置一对多的关系
           modelBuilder.Entity<Student>().HasRequired(s => s.Standard).WithMany(s => s.Students);
           base.OnModelCreating(modelBuilder);
       }


    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class Student
    {
       public int StudentId { get; set; }

       public string StudentName { get; set; }

      // public int StandardRefID { get; set; }

       //[ForeignKey("StandardRefID")]
       public virtual Standard Standard { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EF6
{
   public class Standard
    {
       public int StandardID { get; set; }

       public string Description { get; set; }

       public virtual ICollection<Student> Students { get; set; }

    }
}

可以看到生成的数据库是这样的:

看到没有,虽然生成了一对多的关系,但是外键的名字,还是默认的,我想自定义,接着我们修改一下代码:

改动一下Student实体的代码,取消注释:

  public int StandardRefID { get; set; }
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class Student
    {
       public int StudentId { get; set; }

       public string StudentName { get; set; }

       public int StandardRefID { get; set; }

       //[ForeignKey("StandardRefID")]
       public virtual Standard Standard { get; set; }
    }
}

然后改动上下文的代码:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EF6
{
   public class DbContextClass:DbContext
    {
       public DbContextClass()
           : base("name=ConnectionString") 
       {
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>());
       }

       public DbSet<Student> Students { get; set; }

       public DbSet<Standard> Standards { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           //配置一对多的关系
           modelBuilder.Entity<Student>().HasRequired(s => s.Standard).WithMany(s => s.Students).HasForeignKey(s=>s.StandardRefID);
           base.OnModelCreating(modelBuilder);
       }


    }
}

 

然后又得到想要的数据库了:

后面将学习多对多的关系》》》

 

附上系列目录:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值