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; }//学生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

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

   @陈卧龙的博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对AutoIt中控件和窗口的理解

经过尝试&#xff0c;对AutoIt中Control和Window有了新的认识&#xff0c;分享一下 1.Control 现在我想对一个WinForm架构的应用程序进行自动化操作&#xff0c;得到控件Advanced Mode属性为[Name:XXX]。 然而在该窗口中有多个相同属性的Control&#xff0c;而依该属性只能操作…

【设计模式 01】简单工厂模式(Simple factory pattern)

简单工厂模式 可以根据参数的不同返回不同类的实例 参考&#xff1a; CSDN|简单工厂模式 简单工厂通过传给工厂类的参数的不同&#xff0c;返回不同的对象&#xff0c;包括三部分组成&#xff1a; 具体的”产品“工厂类&#xff08;实例化并返回”产品“&#xff09;客户端&am…

[Hadoop]MapReduce多路径输入与多个输入

1. 多路径输入 FileInputFormat是所有使用文件作为其数据源的 InputFormat 实现的基类&#xff0c;它的主要作用是指出作业的输入文件位置。因为作业的输入被设定为一组路径&#xff0c; 这对指定作业输入提供了很强的灵活性。FileInputFormat 提供了四种静态方法来设定 Job 的…

pvrect r语言 聚类_R语言实现KEGG通路富集可视化

用过KEGG的朋友应该都很熟悉里面的通路地图。你是否想过如果自己可以控制通路图将自己的基因绘制在一个通路图中&#xff0c;那么今天给大家介绍一个新推出的Bioconductor软件包pathview。这个包可以进行KEGG富集分析。首先&#xff0c;我们不耐烦的介绍下Bioconductor包的安装…

【设计模式 02】策略模式( Strategy)

策略模式 参考&#xff1a; CSDN | 策略模式百家号 | 策略模式 如果某个系统需要不同的算法&#xff08;如超市收银的优惠算法&#xff09;&#xff0c;那么可以把这些算法独立出来&#xff0c;使之之间可以相互替换&#xff0c;这种模式叫做策略模式&#xff0c;它同样具有三个…

PL/SQL复合变量

复合变量可以将不同数据类型的多个值存储在一个单元中。由于复合类型可以由用户自己根据需要定义其结构&#xff0c;所以复合数据类型也称为自定义数据类型。在PL/SQL中&#xff0c;使用%TYPE声明的变量类型与数据表中字段的数据类型相同&#xff0c;当数据表中字段数据类型修改…

Android中使用am命令实现在命令行启动程序详解

在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am. 复制代码代码如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写&#xff0c;用虚拟机直接卡成PPT&#xff0c;VS code又不会调试&#xff0c;就搞一下VS 2019吧。 环境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C环境&#xff08;gcc等&#xff09;VS要有 适用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服务平台&#xff0c;使用它的API可以轻松搞定实时推送&#xff01;个人感觉goeasy推送更稳定&#xff0c;推送速度快&#xff0c;代码简单易懂上手快浏览器兼容性&#xff1a;GoEasy推送支持websocket 和polling两种连接方式&#xff0c;从而可以支…

git 移动分支指针_理解git 中的HEAD指针branch指针

HEAD指针使用git checkout 来移动HEAD指针&#xff0c;移动的对象可以是分支指针也可以是快照。HEAD指针可以指向快照也可以指向branch。当指向branch时提交后会和branch指针一起向后移动&#xff0c;当不指向branch提交时时则会在一个detached状态。分支(branch)指针使用git b…

应用程序域

好文链接 使用.NET建立的可执行程序 .exe&#xff0c;并没有直接承载到进程当中&#xff0c;而是承载到应用程序域&#xff08;AppDomain&#xff09;当中。应用程序域是.NET引入的一个新概念&#xff0c;它比进程所占用的资源要少&#xff0c;可以被看作是一个轻量级的进程。 …

【设计模式 03】装饰模式——俄罗斯套娃?

装饰模式(俄罗斯套娃&#xff1f;) 装饰模式&#xff1a;动态的给某些对象添加额外的功能 参考&#xff1a; 简书 | 装饰模式 博客园 | 简说设计模式——装饰模式 博客园 | 装饰器模式 Decorator 结构型 设计模式 (十) 什么是装饰模式 装饰模式也叫装饰器模式&#xff0c;p…

系统移植的四大步骤

最近在学习系统移植的相关知识&#xff0c;在学习和调试过程中&#xff0c;发现了很多问题&#xff0c;也解决了很多问题&#xff0c;但总是对于我们的开发结果有一种莫名其妙的感觉&#xff0c;纠其原因&#xff0c;主要对于我们的开发环境没有一个深刻的认识&#xff0c;有时…

bem什么意思_bem是什么意思_bem的翻译_音标_读音_用法_例句_爱词霸在线词典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生药0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三种浓度…

display:flex

flex&#xff1a;弹性布局 常用属性介绍&#xff1a; flex-direction: column &#xff08;设置主容器主轴方向&#xff09; flex-flow: row wrap &#xff08;第一个参数为flex-direction&#xff0c;第二个为flex-wrap&#xff09; align-items: flex-start &#xff08;设…

Linux(Ubuntu 19.10)下 Qt5 连接 MySQL(QMYSQL driver not loaded)

Linux&#xff08;Ubuntu 19.10&#xff09;下 Qt5 连接 MySQL 安装好 MySQL 和 Qt Qt 连接 MySQL 的代码 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加载mysql驱动&#xff0c;这个字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

华为消息推送 有透传通道吗_求解在推送用透传消息-使用厂商通道(我用的是基座测试) 用手机测试出现了“clientId离线”问题...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用户在其它的app登录&#xff0c;如果有问题&#xff0c;请修改密码或重新登录&#xff01;,// cancelText:"修改密码",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端发展很快&#xff0c;现代浏览器原生 API 已经足够好用。我们并不需要为了操作 DOM、Event 等再学习一下 jQuery 的 API。同时由于 React…

Wpf 数据绑定简介、实例1

简介&#xff1a;1.WPF绑定使用的源属性必须是依赖项属性&#xff0c;这是因为依赖项属性具有内置的更改通知支持&#xff0c;元素绑定表达式使用了Xaml扩展标记&#xff0c; WPF绑定一个控件是使用Binding.ElementName, 绑定非控件对象时使用Source,RelativeSource,DataContex…

【设计模式 04】代理模式

代理模式 代理模式( Proxy)&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 参考&#xff1a;refactoringguru | proxy 什么是代理模式 有时候如果想要访问某个对象&#xff0c;但又没办法直接访问或不方便直接访问&#xff0c;可以使用代理模式&#xff0c;代理…