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

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

   @陈卧龙的博客

 

相关文章
|
1月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
224 93
|
4月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
153 1
|
1月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
259 7
|
1月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
272 4
|
7月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
7月前
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
6月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
4月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
304 3
Jasypt加密数据库配置信息
|
3月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
308 0

热门文章

最新文章