EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

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

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

学无止境,精益求精

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

如有不明白,请参考: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; }//学生ID

        public int CourseID { get; set; }//课程ID

        public 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

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

@陈卧龙的博客

时间: 2024-12-09 03:19:32

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

打造android ORM框架opendroid(二)——自动创建数据库

在上一篇博客<打造android ORM框架opendroid(一)--ORM框架的使用>中相信你已经了解了opendroid的使用,那么从这篇博客开始,我们正式进入opendroid的源码分析,打造一款自己的ORM框架! 在正式开始之前,你需要保证手里有一份opendroid的源码,如果还没下载opendroid,请到http://git.oschina.net/qibin/OpenDroid 下载opendroid的源码. 任何数据库操作都是从创建数据库开始的,今天我们就来看看opendr

Hibernate/JPA 自动创建数据库(MySQL)

平时使用Hibernate/JPA映射MySQL时,经常使用到自动创建数据表操作,自动创建MySQL数据库比较少见. 实际上也可以同时创建数据库,修改一下连接配置即可. 常见的配置如下(以Spring Boot中配置方式为例): spring.datasource.url=jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false

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

本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建分区作业. 步骤一:创建分区的计划任务 打开MsSQL2008,找到作业该项,如果打不开或者SQL Server代理是未启动状态,请先在windows服务中启动SQL Server代理(参考图片),   右击MsSQL2008对象资源管理器中的作业,选择新建作业,输入该作业你想用的名称,类别不用管,

EntityFrameworkCore 根据实体类自动创建数据库

1.首先新建 Asp.Net Core WebApi 项目 2.添加一下引用 : 2.1   Pomelo.EntityFrameworkCore.MySql(我用的Mysql 根据自己情况引用就行) 2.2  Microsoft.EntityFrameworkCore 2.3 Microsoft.EntityFrameworkCore.Design 3.使项目支持dotnet ef 工具以使用Migrations 3.1 手动修改csproj文件(手动添加是因为在nuget添加Microsof

EF CodeFirst简介、默认约定、数据库初始化策略

CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirst默认约定 约定就是一系列的默认规则,通过这些规则,在使用EF Code-First的时候,可以自动的基于你的领域类配置概念模型.默认约定的命名空间:System.Data.Entity.ModelConfiguration.Conventions; ①schema(模式)  默认情况下,EF会为所有的数据库

【C#】EF学习&lt;二&gt; DbFirst (先创建数据库,表及其关联关系)

工程压缩文件放到百度云盘---20181019001文件夹 1. 创建表的脚本 create table Teacher ( TID char(12) primary key, Tname char(6) not null ) create table Student ( SID char(12) primary key, Sname char(6) not null, Sage INT not null, Ssex char(2) check(Ssex between ' 男' and '女'

oracle的环境配置-单独创建数据库实例

单独创建数据库实例 数据库1    数据库2ORCL        LAW  ------RDBMS(服务)  |                  |-----------------------    安装数据库软件(DBMS) 单独再创建一个RDBMS--LAW [[email protected] ~]# xhost +access control disabled, clients can connect from any host  --自动启动了xmanager passive[[

Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍

创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上创建数据库结构 from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.Ch

自动创建数据库(DELPHI+SQL SERVER)

procedure TForm1.Btn_OKClick(Sender: TObject); var sqlconn:string; begin Sqlconn:='Provider=SQLOLEDB.1;'+'password='+Edit_Password.Text +';Persist Security Info=true;User ID='+Edit_Name.Text +';Data Source='+Edit_Server.Text; if Edit_Server.Text=Empt