实验环境是VS 2015、MSSQL Server 2008、windows 10

一、创建项目

  通过VS创建一个MVC5项目EntityFrameworkExtension

二、安装Entity Framework

  通过nuget添加Entity Framework到项目,当前版本为6.2.0

三、创建实体类Student  

public class Student
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; } }

四、添加数据库连接和上下文

  在web.config中添加数据库链接

<connectionStrings>
<add name="EfDefault" connectionString="Server=.;Database=CodeFirstApp;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
</connectionStrings>

  创建上下文EfContext

public class EfContext : DbContext
{
public EfContext():base("name=EfDefault")
{ } private DbSet<Student> Students { get; set; }
}

  在这里,DbContext是所有基于EF的上下文基类,通过它可以访问到数据库中的所有表。上面的代码中调用了父类的构造函数,并且传入了一个键值对,键是name,值是FirstCodeFirstApp

五、启用迁移

  在程序包管理器控制台用命令进行开启迁移

PM> Enable-Migrations

  a.指定DbContext: Enable-Migrations -ContextTypeName XXXXContext

  b.指定项目名称:      Enable-Migrations -StartUpProjectName XXX -Force

  将自动生成迁移文件夹Migrations和Configuration.cs

namespace EntityFrameworkExtension.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<EntityFrameworkExtension.Entities.EfContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
} protected override void Seed(EntityFrameworkExtension.Entities.EfContext context)
{
// This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
}

  这时自动迁移是被关闭的,需要手动迁移

PM> add-migration InitDb

  将自动在Migrations生成迁移代码文件xxxx_迁移名称.cs,如201804160820076_InitDb.cs

  使用命令进行手动迁移

PM> update-database -verbose

  verbose可以查看命令的执行过程

Using StartUp project 'EntityFrameworkExtension'.
Using NuGet project 'EntityFrameworkExtension'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'CodeFirstApp' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration).
Applying explicit migrations: [201804160820076_InitDb].
Applying explicit migration: 201804160820076_InitDb.
CREATE TABLE [dbo].[Students] (
[Id] [nvarchar]() NOT NULL,
[Name] [nvarchar](max),
[Age] [int] NOT NULL,
CONSTRAINT [PK_dbo.Students] PRIMARY KEY ([Id])
)
CREATE TABLE [dbo].[__MigrationHistory] (
[MigrationId] [nvarchar]() NOT NULL,
[ContextKey] [nvarchar]() NOT NULL,
[Model] [varbinary](max) NOT NULL,
[ProductVersion] [nvarchar]() NOT NULL,
CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey])
)
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201804160820076_InitDb', N'EntityFrameworkExtension.Migrations.Configuration', 此处省略 , N'6.2.0-61023') Running Seed method.

然后刷新数据库即可看到创建的表,其中__MigrationHistory是EF自动生成的迁移日志表

六、生成指定版本的迁移脚本

PM> Update-Database -SourceMigration 201806190702572_XX1 -TargetMigration 201806200143418_XX2 -Script 

生成迁移脚本时产生错误:
  未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“MMIS.Data.Migrations.AlterReceive.resources”正确嵌入或链接到程序集“MMIS.Data”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。

原因:

  Migrations迁移文件夹下的每个迁移文件包含xxxx.cs、xxxx.Designer.cs、xxxx.resx,而其中.resx文件由于svn的原因而被隐藏导致的

迁移问题总结

一、当前库的数据库表结构已被更改为最新,出现未迁移提醒的问题。

  可能的起因:两个人都提交了迁移文件,进行一次update-database,引起迁移冲突

  解决:

  删除迁移表的本次迁移记录(多条),删除迁移文件(多个)。

  重新使用Add-Migration AddNewTest生成迁移文件,注释掉迁移文件内容,进行update-database -verbose

参考文章:http://www.cnblogs.com/farb/p/FirstCodeFirstApp.html

EF Codefirst入门之创建数据库的更多相关文章

  1. MVC CodeFirst简单的创建数据库(非常详细的步骤)

       最近在学习MVC的开发,相信有过开发经验的人初学一个新的框架时候的想法跟我一样最关心的就是这个框架如何架构,每个架构如何分工,以及最最关键的就是如何与数据库通信,再下来才是学习基础的页面设计啊等 ...

  2. EF Code-First 学习之旅 数据库初始化 (二)

    Context类的基类构造函数有如下的参数 1.无参数 如果没有给基类构造函数添加参数,它会在local SQLEXPRESS server创建数据库,名为{Namespace}.{Context c ...

  3. Hibernate入门之创建数据库表

    前言 Hibernate 5.1和更早版本至少需要Java 1.6和JDBC 4.0,Hibernate 5.2和更高版本至少需要Java 1.8和JDBC 4.2,从本节开始我们正式进入Hibern ...

  4. C# CodeFirst(EF框架)代码优先创建数据库

    namespace WebEF.Model{ public class ModelContext:DbContext //继承DBcontext 来自EF框架 { public ModelContex ...

  5. 2、Entity Framework Core 3.1入门教程-创建数据库和迁移

    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...

  6. EF CodeFirst使用Nuget更新数据库

    常用命令: 1.开启迁移 Enable-Migrations -EnableAutomaticMigrations 2.添加一条迁移记录 Add-Migration AddMigration001 3 ...

  7. EF Code-First 学习之旅 数据库初始化

    1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...

  8. 七:mvc使用CodeFirst(代码优先)创建数据库

    1. 理解EF CodeFirst模式特点 2. 使用CodeFirst模式生成数据库 1. CodeFirst模式(代码优先) Code First是Entity Framework提供的一种新的编 ...

  9. (17)ASP.NET Core EF基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上 ...

随机推荐

  1. JAVA核心技术I---JAVA基础知识(文本文件读写)

    一:java IO包概述 (一)Java读写文件,只能以(数据)流的形式进行读写 (二)java IO 包 –节点类:直接对文件进行读写 –包装类 • 转化类:字节/字符/数据类型的转化类 • 装饰类 ...

  2. python 生成器和各种推导式

    ##################################总结############################### 什么是迭代器? 可迭代对象通过__iter__()可以转换成迭代 ...

  3. sql关联更新

    /****** Script for SelectTopNRows command from SSMS ******/SELECT * FROM [LFBMP.Operating].[dbo].[Sh ...

  4. 使用JMeter进行一次简单的带json数据的post请求测试,json可配置参数

    配置: 1.新建一个线程组: 然后设置线程数.运行时间.重复次数. 2.新建Http请求: 设置服务器域名,路径,方法,编码格式,数据内容. 可以在函数助手中,编辑所需要的变量,比如本例中的随机生成电 ...

  5. Kettle系列: Kettle并行执行Trans后的合并问题

    我们在作业开发中为了处理效率, 经常需要并行执行一些trans, 等它们执行完毕后, 需要执行另外一些trans, 从流程上也就是分支+汇合. 粗看起来很简单, Kettle中对接一下这些组件就搞定了 ...

  6. 01.Redis 初体验

    0. Redis安装 官网下载Redis 解压缩 make make install 安装后的执行命令被保存在了/usr/local/bin目录下 1. 配置文件:redis.conf daemoni ...

  7. 002_Add Two Numbers

    # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # sel ...

  8. Python之线程 3 - 信号量、事件、线程队列与concurrent.futures模块

    一 信号量 二 事件 三 条件Condition 四 定时器(了解) 五 线程队列 六 标准模块-concurrent.futures 基本方法 ThreadPoolExecutor的简单使用 Pro ...

  9. cocos2dx 动画控制概要

    -------------------------------------------------Cocos2d 播放动画Node : 节点,所有显示容器的基础 Sprite : 使用图片的节点 An ...

  10. Python操作Redis数据库

    连接数据库 StrictRedis from redis import StrictRedis # 使用默认方式连接到数据库 redis = StrictRedis(host='localhost', ...