EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。
十年河东十年河西,莫欺少年穷
学无止境,精益求精
话说EF支持三种模式:Code First Model First DataBase First,微软最新的EF框架,也就是EF7舍弃了Model First 和 DataBase First,咱们作为最底层的程序员必须跟着‘党’的走,既然微软都放弃了Model First 和 Database First,那么我们也应当跟着‘党’的路线走,表示坚决拥护‘党’的决定,坚决走Code First路线。
在此:仅仅作为入门,讲解下EF CodeFirst 创建数据库。
首先我们创建一个MVC项目,并在Model中添加如下类库:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Web; namespace EF_Test.Models
{
public class Student
{
[Key]
public int Id { get; set; }
[Required]
[StringLength()]
public string Name { get; set; }
public string Sex { get; set; }
}
public class Course
{
[Key]
public int Id { get; set; }
[Required]
[StringLength()]
public string Name { get; set; }
} public class Score
{
[Key]
public int Id { get; set; } public int StudentScore { get; set; } public Student Student { get; set; } public Course Course { get; set; } } public class StudentContext : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<Score> Scores { get; set; }
}
}
或者如下代码
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.Models
{
public class Student
{
[Key]
public int Id { get; set; }
[Required]
[StringLength()]
public string Name { get; set; }
[StringLength()]
public string Sex { get; set; }
[StringLength()]
public string StudentNum { get; set; }
} public class Course
{
[Key]
public int Id { get; set; }
[Required]
[StringLength()]
public string Name { get; set; }
} public class Score
{
[Key]
public int Id { get; set; } public int StudentScore { get; set; } public Student Student { get; set; } public Course Course { get; set; } } 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>();
}
}
}
然后,我们在控制器中添加如下代码:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using EF_Test.Models; namespace EF_Test.Controllers
{
public class HomeController : Controller
{
/// <summary>
///
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
var StudentModel = new Student
{
Name = "陈卧龙",
Sex="男"
}; var CourseModel = new Course()
{
Name="数据结构"
}; var ScoreModel = new Score()
{
Student = StudentModel,
Course = CourseModel,
StudentScore =
};
//
using (var context = new StudentContext())
{
context.Students.Add(StudentModel);
context.Courses.Add(CourseModel);
context.Scores.Add(ScoreModel);
context.SaveChanges();
}; return View();
}
}
}
下面我们来分析下:
我们创建了三个实体类:Student、Course、Score 分别代表:学生、课程、成绩
一个上下文类StudentContext,继承自DBContext,拥有三个属性:Students、Courses、Scores,这三个属性代表三张数据表,分别映射对象:Student、Course、Score
控制器中我们尝试为各个对象创建数据,并插入数据库
我们来运行程序:
运行结果:并没有生成数据库
究其原因,是我们的项目中没有指定连接字符串,我指定的连接字符串如下:
注意:连接字符串的Name值必须和上下文类一致,连接字符串要结合本机进行生成,我的数据库为:
加上连接字符串后,我们可以正常生成数据库,如下:
现在问题来了,如果我们修改Model对象,数据库表结构及数据会相应变化吗?
我们将Student 修改为:
public class Student
{
[Key]
public int Id { get; set; }
[Required]
[StringLength()]
public string Name { get; set; }
[StringLength()]
public string Sex { get; set; }
[StringLength()]
public string StudentNum { get; set; }
}
运行程序:
大致意思是告诉我们:数据上下文类结构发生了变化且数据库已经创建了,请使用代码优先数据迁移修改数据库
咋办?
这时候,我们引入另一个话题:EF数据库初始化的几种方式
那么EF有几种数据库初始化方式呢?
有兴趣的小虎斑可以查看我的博客:Entity FrameWork初始化数据库的四种策略
说来也惭愧,上述博客是我两年前所写,而我至今对EF还是一知半解,模模糊糊,嘻嘻,惭愧惭愧。
一步一个台阶,总会步入青云,扯远啦,咱继续:
在EF初始化数据库时,有四种策略:
一、 每次运行都会创建新的数据库
Database.SetInitializer<XXXXXContext>(new DropCreateDatabaseAlways<XXXXXContext>());
二、只有第一次运行~才会创建新的数据库~默认的方式
Database.SetInitializer<XXXXXContext>(new CreateDatabaseIfNotExists<XXXXXContext>());
三、 修改模型后~运行~会创建新的数据库
Database.SetInitializer<XXXXXContext>(new DropCreateDatabaseIfModelChanges<XXXXXContext>());
四、使用自己配置的数据库,请到:web.config中配置自己的连接字符串,注意连接字符串的名称应与上下文:XXXXContext的名字一致。
Database.SetInitializer<Models.musicStoreContext>(null);
根据上述我们的需求:我们的模型发生了变化,我们应当采用:第三种形式,因此:我们在APP_Start中添加如下代码:
控制器添加个学号:
重新运行项目,我们得到如下结果:
注:如果运行后,告诉你数据库正在使用,删除数据库失败,请把项目解决方案清空并关闭数据库,然后运行项目。
以下供自己查看,嘻嘻
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; }
}
@陈卧龙的博客
EF CodeFirst 创建数据库的更多相关文章
- NetCore2.0下使用EF CodeFirst创建数据库
本文所使用的VS版本:VS2017 15.3.0 首先新建一个.net core项目 取名NetCoreTask 使用模型视图控制器方式 新建Model层 在Model层下新建一个user实体类 1 ...
- 使用EF CodeFirst 创建数据库
EntityFramework 在VS2015添加新建项时,选择数据->ADO.NET 实体数据模型,有一下选项 来自数据库的EF设计器,这个就是我们最常用的EntityFramework设计模 ...
- ASP.NET Core 2.2 WebApi 系列【二】使用EF CodeFirst创建数据库
Code First模式 Code First是指"代码优先"或"代码先行". Code First模式将会基于编写的类和配置,自动创建模型和数据库. 一.准备 ...
- EF自动创建数据库步骤之三(自定义数据库初始器)
EF自动创建数据库需要我们告诉数据库如何进行初始化:如创建表后是否需要插入一些基础数据,是否 需要创建存储过程.触发器等.还有就是EF有三种初始化方式(参见下面三个类): DropCreateData ...
- EF自动创建数据库步骤之一(实体类写法)
文章演示使用EF自动创建数据库第一个步骤创建实体类. 一.创建表映射实体类 using System; using System.Collections.Generic; using System.C ...
- EF CodeFirst生成数据库到Sqlserver中
EF CodeFirst简单实例这篇文章介绍了如何用EF去快速生成数据库.但是这个并没有生成到sqlserver中,总觉得不爽.下面就来讲一下,如何将数据库生成到sqlserver中. 按照EF Co ...
- EF自动创建数据库步骤之二(继承DbContext类)
创建好表实体类后,接着就是创建数据库上下文(继承DbContext)并将实体类添加进来. 代码示例如下: using DBClientEntity; using System; using Syste ...
- 使用CodeFirst创建数据库
1.新建一个类库项目 2.右键管理Nuget程序包,搜索EntityFramework.然后安装 3.新建一个类,然后引用 using System.Data.Entity; 然后写类初始化方法(ba ...
- EF自动创建数据库步骤之四(启用数据库初始器)
在创建完DBIfNotExistsInitializer数据库初始化器类后,需要在程序每一次访问数据库前,告诉EF使用该初始化器进行初始化. 代码如下 : Database.SetInitialize ...
随机推荐
- 【BZOJ】3916: [Baltic2014]friends
http://www.lydsy.com/JudgeOnline/problem.php?id=3916 #include <bits/stdc++.h> using namespace ...
- CF 2B.The least round way
题目链接 很久以前就见过此题,以前看了题解,然后今天写了写,写的真搓. #include <cstdio> #include <cstring> #include <st ...
- 7zip ubuntu使用
http://www.cnblogs.com/yiwd/p/3649094.html 安装: sudo apt-get install p7zip 解压: 7zr x file -r -o./path ...
- IOS面试题总结
iOS面试题: 一:网络理论知识的理解 1:Internet物理地址和IP地址转换采用什么协议 ARP(Address Resolution Protocol)地址解析协议 2:Internet采用哪 ...
- RSA_RSA算法原理(二)
上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎 ...
- PHP 高效分布代码转的
在<efficient pagination using mysql>中提出的clue方式. 利用clue方法,给翻页提供一些线索,比如还是SELECT * FROM `csdn` ord ...
- IE6、7绝对定位层被遮挡的原因(主要是父层决定的)
最近做项目,经常遇到IE7以下浏览器中.一些悬浮框被一些元素遮挡的问题,这些元素一般都是设置了position的.问题的根本在不是被设置绝对定位的元素上,而是在设置了相对定位的父元素上. 我查阅了 ...
- jQuery $(document).ready()和window.onload
jQuery $(document).ready()和window.onload 根据ready()方法的API说明http://api.jquery.com/ready/. 这个方法接收一个func ...
- nginx基于IP的虚拟主机
知识点: server的语法: upstream语法: upstream中192.168.100.1不是ip只是个标识,只要和下面的proxy_pass 对应即可. 基于IP的虚拟主机: listen ...
- java四种内部类详解
一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变 ...