最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。
十年河东十年河西,莫欺少年穷
学无止境,精益求精
本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧惭愧。
如有不明白,请参考:EF CodeFirst 创建数据库 及 EF CodeFirst增删改查之‘CRUD’
话不多说,直接上代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace EF_Test.DAL {public class StudentInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StudentContext>{protected override void Seed(StudentContext context){//添加学生var studentList = new List<Student>{new Student{Name = "陈依依", Sex = "女", StudentNum = "081309201"},new Student{Name = "戚永景", Sex = "女", StudentNum = "081309202"},new Student{Name = "刘华丽", Sex = "女", StudentNum = "081309203"},new Student{Name = "薛正钦", Sex = "男", StudentNum = "081309204"},new Student{Name = "王松涛", Sex = "男", StudentNum = "081309205"},new Student{Name = "王自龙", Sex = "男", StudentNum = "081309206"},new Student{Name = "高其峰", Sex = "男", StudentNum = "081309207"},new Student{Name = "陈欣欣", Sex = "女", StudentNum = "081309208"},new Student{Name = "陈丽阳", Sex = "女", StudentNum = "081309209"}};studentList.ForEach(s => context.Students.Add(s));context.SaveChanges();//添加课程var courseList = new List<Course>{new Course{ Name="数据结构"},new Course{ Name="计算机原理"},new Course{ Name="网络技术"}};courseList.ForEach(s => context.Courses.Add(s));context.SaveChanges();//添加分数var scoreList = new List<Score>(){new Score{ StudentID=1,CourseID=1,StudentScore=90},new Score{ StudentID=2,CourseID=1,StudentScore=91},new Score{ StudentID=3,CourseID=1,StudentScore=92},new Score{ StudentID=4,CourseID=1,StudentScore=93},new Score{ StudentID=5,CourseID=1,StudentScore=94},new Score{ StudentID=6,CourseID=1,StudentScore=95},new Score{ StudentID=7,CourseID=1,StudentScore=96},new Score{ StudentID=8,CourseID=1,StudentScore=97},new Score{ StudentID=9,CourseID=1,StudentScore=98}};scoreList.ForEach(s => context.Scores.Add(s));context.SaveChanges();}} }
模型类如下:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Linq; using System.Web;namespace EF_Test.DAL {public class Student{[Key]public int Id { get; set; }[Required][StringLength(10)]public string Name { get; set; }//姓名[StringLength(2)]public string Sex { get; set; }//性别[StringLength(20)]public string StudentNum { get; set; }//学号 }public class Course{[Key]public int Id { get; set; }[Required][StringLength(20)]public string Name { get; set; }//课程名称 }public class Score{[Key]public int Id { get; set; }public int StudentScore { get; set; }//学生分数public int StudentID { get; set; }//学生IDpublic int CourseID { get; set; }//课程IDpublic virtual Student Student { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时 属性==对象public virtual Course Course { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时 属性==对象 }public class StudentContext : DbContext{public StudentContext(): base("StudentContext")//指定连接字符串 {}public DbSet<Student> Students { get; set; }public DbSet<Course> Courses { get; set; }public DbSet<Score> Scores { get; set; }/// <summary>/// OnModelCreating方法中的modelBuilder.Conventions.Remove语句禁止表名称正在多元化。如果你不这样做,所生成的表将命名为Students、Courses和Enrollments。相反,表名称将是Student、Course和Enrollment。开发商不同意关于表名称应该多数。本教程使用的是单数形式,但重要的一点是,您可以选择哪个你更喜欢通过包括或省略这行代码的形式。/// </summary>/// <param name="modelBuilder"></param>protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();}} }
OK,截止到这儿,您可能会问我,protected override void Seed()这个重写的方法什么时间执行呢?
在此,需要两点要求
1、在web.config中<entityFramework>接点下加入如下配置:
<contexts><context type="EF_Test.DAL.StudentContext, EF_Test"><databaseInitializer type="EF_Test.DAL.StudentInitializer, EF_Test" /></context></contexts>
根据上述类文件,我们应该明白EF_Test是个命名空间,EF_Test.DAL.StudentContext是数据库上下文,EF_Test.DAL.StudentInitializer是初始化类
2、加上了上述配置,还需模型结构发生改变时,程序才会自动执行Seed()方法,例如:将字段长度由50改为20
综上所述条件满足后,程序就会自动重新删除数据库并建立
@陈卧龙的博客