最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

十年河东十年河西,莫欺少年穷

学无止境,精益求精

   本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧惭愧。

如有不明白,请参考:EF CodeFirst 创建数据库 及 EF CodeFirst增删改查之‘CRUD’

话不多说,直接上代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace EF_Test.DAL
  7. {
  8. public class StudentInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StudentContext>
  9. {
  10. protected override void Seed(StudentContext context)
  11. {
  12. //添加学生
  13. var studentList = new List<Student>
  14. {
  15. new Student{Name = "陈依依", Sex = "女", StudentNum = ""},
  16. new Student{Name = "戚永景", Sex = "女", StudentNum = ""},
  17. new Student{Name = "刘华丽", Sex = "女", StudentNum = ""},
  18. new Student{Name = "薛正钦", Sex = "男", StudentNum = ""},
  19. new Student{Name = "王松涛", Sex = "男", StudentNum = ""},
  20. new Student{Name = "王自龙", Sex = "男", StudentNum = ""},
  21. new Student{Name = "高其峰", Sex = "男", StudentNum = ""},
  22. new Student{Name = "陈欣欣", Sex = "女", StudentNum = ""},
  23. new Student{Name = "陈丽阳", Sex = "女", StudentNum = ""}
  24. };
  25. studentList.ForEach(s => context.Students.Add(s));
  26. context.SaveChanges();
  27. //添加课程
  28. var courseList = new List<Course>
  29. {
  30. new Course{ Name="数据结构"},
  31. new Course{ Name="计算机原理"},
  32. new Course{ Name="网络技术"}
  33. };
  34. courseList.ForEach(s => context.Courses.Add(s));
  35. context.SaveChanges();
  36. //添加分数
  37. var scoreList = new List<Score>()
  38. {
  39. new Score{ StudentID=,CourseID=,StudentScore=},
  40. new Score{ StudentID=,CourseID=,StudentScore=},
  41. new Score{ StudentID=,CourseID=,StudentScore=},
  42. new Score{ StudentID=,CourseID=,StudentScore=},
  43. new Score{ StudentID=,CourseID=,StudentScore=},
  44. new Score{ StudentID=,CourseID=,StudentScore=},
  45. new Score{ StudentID=,CourseID=,StudentScore=},
  46. new Score{ StudentID=,CourseID=,StudentScore=},
  47. new Score{ StudentID=,CourseID=,StudentScore=}
  48. };
  49. scoreList.ForEach(s => context.Scores.Add(s));
  50. context.SaveChanges();
  51. }
  52. }
  53. }

模型类如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Data.Entity;
  5. using System.Data.Entity.ModelConfiguration.Conventions;
  6. using System.Linq;
  7. using System.Web;
  8.  
  9. namespace EF_Test.DAL
  10. {
  11. public class Student
  12. {
  13. [Key]
  14. public int Id { get; set; }
  15. [Required]
  16. [StringLength()]
  17. public string Name { get; set; }//姓名
  18. [StringLength()]
  19. public string Sex { get; set; }//性别
  20. [StringLength()]
  21. public string StudentNum { get; set; }//学号
  22. }
  23.  
  24. public class Course
  25. {
  26. [Key]
  27. public int Id { get; set; }
  28. [Required]
  29. [StringLength()]
  30. public string Name { get; set; }//课程名称
  31. }
  32.  
  33. public class Score
  34. {
  35. [Key]
  36. public int Id { get; set; }
  37.  
  38. public int StudentScore { get; set; }//学生分数
  39.  
  40. public int StudentID { get; set; }//学生ID
  41.  
  42. public int CourseID { get; set; }//课程ID
  43.  
  44. public virtual Student Student { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时 属性==对象
  45.  
  46. public virtual Course Course { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时 属性==对象
  47. }
  48.  
  49. public class StudentContext : DbContext
  50. {
  51. public StudentContext()
  52. : base("StudentContext")//指定连接字符串
  53. {
  54.  
  55. }
  56. public DbSet<Student> Students { get; set; }
  57. public DbSet<Course> Courses { get; set; }
  58. public DbSet<Score> Scores { get; set; }
  59.  
  60. /// <summary>
  61. /// OnModelCreating方法中的modelBuilder.Conventions.Remove语句禁止表名称正在多元化。如果你不这样做,所生成的表将命名为Students、Courses和Enrollments。相反,表名称将是Student、Course和Enrollment。开发商不同意关于表名称应该多数。本教程使用的是单数形式,但重要的一点是,您可以选择哪个你更喜欢通过包括或省略这行代码的形式。
  62. /// </summary>
  63. /// <param name="modelBuilder"></param>
  64. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  65. {
  66. modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  67. }
  68. }
  69. }

OK,截止到这儿,您可能会问我,protected override void Seed()这个重写的方法什么时间执行呢?

在此,需要两点要求

1、在web.config中<entityFramework>接点下加入如下配置:

  1. <contexts>
  2. <context type="EF_Test.DAL.StudentContext, EF_Test">
  3. <databaseInitializer type="EF_Test.DAL.StudentInitializer, EF_Test" />
  4. </context>
  5. </contexts>

根据上述类文件,我们应该明白EF_Test是个命名空间,EF_Test.DAL.StudentContext是数据库上下文,EF_Test.DAL.StudentInitializer是初始化类

2、加上了上述配置,还需模型结构发生改变时,程序才会自动执行Seed()方法,例如:将字段长度由50改为20

综上所述条件满足后,程序就会自动重新删除数据库并建立

@陈卧龙的博客

EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>的更多相关文章

  1. EF CodeFirst关于Mysql如何自动生成数据库表

    相对于sqlserver数据库,mysql的配置过程相对麻烦一些,我们从0讲起. 1.新建一个控制台应用程序 右键点击引用--管理NuGet程序包,搜索Mysql.Data.Entity并安装,安装完 ...

  2. EF自动创建数据库步骤之三(自定义数据库初始器)

    EF自动创建数据库需要我们告诉数据库如何进行初始化:如创建表后是否需要插入一些基础数据,是否 需要创建存储过程.触发器等.还有就是EF有三种初始化方式(参见下面三个类): DropCreateData ...

  3. EF自动创建数据库步骤之一(实体类写法)

    文章演示使用EF自动创建数据库第一个步骤创建实体类. 一.创建表映射实体类 using System; using System.Collections.Generic; using System.C ...

  4. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...

  5. SpringBoot使用Hibernate,实现自动创建数据库表【博客数据库设计】

    我们准备设计博客,那就要设计数据库. 我们可以使用Hibernate来自动生成数据库. 博客数据库的结构: 实体类: 博客 Blog 博客分类 Type 博客标签 Tag 博客评论 Comment 用 ...

  6. EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除

    外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...

  7. sql2008 计划自动创建数据库分区【转】

    本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...

  8. centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例

    centos 安装oracle 11g r2(二)-----监听配置与创建数据库实例 一.监听配置(命令:netca) 1.以 oracle 用户输入命令,启动图形化工具配置监听 [oracle@lo ...

  9. EF自动创建数据库步骤之二(继承DbContext类)

    创建好表实体类后,接着就是创建数据库上下文(继承DbContext)并将实体类添加进来. 代码示例如下: using DBClientEntity; using System; using Syste ...

随机推荐

  1. 51nod百度之星2016练习赛

    今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. (5.26UPD:E题想粗来了) A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min ...

  2. 直接用Qt写soap

    直接用Qt写soap 最近的项目里用到了webservice, 同事用的是`gSoap`来搞的. 用这个本身没什么问题, 但这货生成的代码实非人类可读, 到处都是`__`和`_`, 看得我眼晕.... ...

  3. NHibernate one-to-one

    NHibernate里面one-to-one有两种方式:主键关联和唯一外健关联 主键关联: 两个表拥有相同的主键字段,值相同的关联在一起.典型的应用是一个对象的属性太多,将常用的属性跟不常用的附加属性 ...

  4. Hashtable在ViewState中无法增加值

    在我调试程序的时候,我发现WebForm 2.0和MVC3解析ViewState的方式不同,同样的代码,在Weorm中管用,在MVC中不起作用. private Hashtable ht { get ...

  5. Hibernate的第一次测试解析

    解析:此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通过属性作为筛选条件,如统计报表数据.使用 ...

  6. [LintCode] Surrounded Regions 包围区域

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  7. Daily Scrum 11.5

    今天成员全部到齐,对今天的工作进行了总结,并对明天的工作作了安排.由于先前分配的任务都已基本完成,要完成程序的三级优化是较为艰巨的任务.所以我们讨论决定,除PM外其他成员都投入到程序的优化和改进中去. ...

  8. Codeforces Beta Round #78 Div. 1 A

    题目链接:http://codeforces.com/contest/98/problem/A 题意大意:给你6种颜色,这6种颜色可能相同也可能不同,把这几种颜色全涂在一个正方体表面,问有多少种涂法( ...

  9. 关于WebDAV带来的网站潜在安全问题的疑问

    WebDAV:分布式创作和版本控制协议 (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1 ...

  10. Web前端开发基础 第四课(颜色值)

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 前面几个小节中经 ...