EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)

原文地址:Code First Migrations and Deployment

原文主要讲两部分:开发环境下数据库迁移到其他数据库服务器;以及在Azure上如何部署应用;

迁移数据库

原文前面讲一堆内容,主要就是说数据库在开发过程中,如果数据模型经常需要调整,那么数据库每次都删除重建有点不太现实;尤其是对于已部署的正式环境,需要的仅仅是数据库升级,而不可能直接Drop掉,再重新Create.

所以,需要启用EF的数据迁移功能。

原文为了演示效果更好,就直接演示了迁移升级到一个全新的数据库中:

第1步:把Web.config文件中 entityFramework节点下 contexts注释掉:

  <entityFramework>
<!--<contexts>
<context type="EFTest.DAL.SchoolContext, EFTest">
<databaseInitializer type="EFTest.DAL.SchoolInitializer, EFTest" />
</context>
</contexts>-->
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>

第2步:数据库连接字符串中,数据库名改个名字,比如EFTest2

<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(localdb)\ProjectsV13;Initial Catalog=EFTest2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;" providerName="System.Data.SqlClient" />
</connectionStrings>

第3步:打开PM控制台:

第4步: 先执行 enable-migrations , 会创建一个Migrations子目录,并多出一个Configuration.cs文件;

再执行 add-migration InitialCreate , 会在Migrations子目录创建一个带时间戳的 xxxxxxxxxx_InitialCreate文件;

第5步,在Configuration.cs文件 有个Seed方法就是用来初始化数据库的时候放入的种子数据; 可以如以下方式加入数据:

在这个要注意,Seed方法在后面执行update-database命令的时候会被执行,而且每次执行update-database命令的时候都会执行;

所以这个地方需要用AddOrUpdate来处理一些种子数据,防止插入重复数据;

另外,注意一些外键数据,例如是数据库自增长的列,则需要前面先保存的数据到数据库,然后才用ID这属性值(不然ID是没数据的)

namespace EFTest.Migrations
{
using Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<EFTest.DAL.SchoolContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
} protected override void Seed(EFTest.DAL.SchoolContext 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. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
// var students = new List<Student>
{
new Student { FirstMidName = "Carson", LastName = "Alexander",
EnrollmentDate = DateTime.Parse("2010-09-01") },
new Student { FirstMidName = "Meredith", LastName = "Alonso",
EnrollmentDate = DateTime.Parse("2012-09-01") },
new Student { FirstMidName = "Arturo", LastName = "Anand",
EnrollmentDate = DateTime.Parse("2013-09-01") },
new Student { FirstMidName = "Gytis", LastName = "Barzdukas",
EnrollmentDate = DateTime.Parse("2012-09-01") },
new Student { FirstMidName = "Yan", LastName = "Li",
EnrollmentDate = DateTime.Parse("2012-09-01") },
new Student { FirstMidName = "Peggy", LastName = "Justice",
EnrollmentDate = DateTime.Parse("2011-09-01") },
new Student { FirstMidName = "Laura", LastName = "Norman",
EnrollmentDate = DateTime.Parse("2013-09-01") },
new Student { FirstMidName = "Nino", LastName = "Olivetto",
EnrollmentDate = DateTime.Parse("2005-08-11") }
};
students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
context.SaveChanges(); var courses = new List<Course>
{
new Course {CourseID = , Title = "Chemistry", Credits = , },
new Course {CourseID = , Title = "Microeconomics", Credits = , },
new Course {CourseID = , Title = "Macroeconomics", Credits = , },
new Course {CourseID = , Title = "Calculus", Credits = , },
new Course {CourseID = , Title = "Trigonometry", Credits = , },
new Course {CourseID = , Title = "Composition", Credits = , },
new Course {CourseID = , Title = "Literature", Credits = , }
};
courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s));
context.SaveChanges(); var enrollments = new List<Enrollment>
{
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alexander").ID,
CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID,
Grade = Grade.A
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alexander").ID,
CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID,
Grade = Grade.C
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alexander").ID,
CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alonso").ID,
CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alonso").ID,
CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Alonso").ID,
CourseID = courses.Single(c => c.Title == "Composition" ).CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Anand").ID,
CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Anand").ID,
CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Barzdukas").ID,
CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Li").ID,
CourseID = courses.Single(c => c.Title == "Composition").CourseID,
Grade = Grade.B
},
new Enrollment {
StudentID = students.Single(s => s.LastName == "Justice").ID,
CourseID = courses.Single(c => c.Title == "Literature").CourseID,
Grade = Grade.B
}
}; foreach (Enrollment e in enrollments)
{
var enrollmentInDataBase = context.Enrollments.Where(
s =>
s.Student.ID == e.StudentID &&
s.Course.CourseID == e.CourseID).SingleOrDefault();
if (enrollmentInDataBase == null)
{
context.Enrollments.Add(e);
}
}
context.SaveChanges();
}
}
}

带时间戳的 xxxxxxxxxx_InitialCreate文件本次不需要自己调整,主要包含了Up和Down 方法;

Up用来升级数据库;Down用来恢复数据库;

第6步:在PM控制台输入 update-database 进行数据升级(本次是新建一个新数据库EFTest2 并新建表,并插入种子数据)

部署至 Azure

后面部分原文采用的是国际版的Azure,并且是经典管理页面,后面本人将采用国内世纪互联版Azure以及新的资源组管理页面来测试部署应用;

前提条件:需要有世纪互联运营的中国区Azure订阅账号!

www.portal.azure.cn 用订阅账号登录。

步骤1:先新建一个资源组用来进行综合管理项目下属的Azure资源(如 App Service , SQL DB, 或者以后Blob 存储等)

步骤2:建SQL Server 数据库,本次先用SQL Server 测试;(Azure也支持MySQL)

先输入数据库名称,选择第1步创建好的资源组;点击配置Server,在右页点击新建一个Server (如果已经有DB Server ,可以直接选择,一个Server上可以多个DB实例)

如果是新建的Server ,需要输入Server Name ,以及设置访问的账号及密码;选择区域,人在上海,所以选择东区;

默认的数据库规格有点高,测试就用最小的规格就可以。。。选择Price Tier 改为 5DTU 2GB

点击Create后,等创建结束即可;可以点击刷新按钮看下:

步骤3:数据库新建后,就可以做次数据库迁移;

在做数据库迁移之前,需要设置Azure的数据库可以被本地的IP地址访问到:

点击选中SQL 数据库,在Overview的右页点击 Set Server firewall

不需要自己去查自己的外网IP地址是多少,已经自动帮你列好,只要点上面的Add client IP按钮即可:

千万记得点 Save

获取连接字符串:

把拷贝的数据库连接字符串粘贴到应用的Web.Config

(请把账号和密码填进去。。。。。不要忘记了)

然后直接在PMC输入 update-database

步骤4:新建App Service

选择Web App:

一堆废话就不看了,点创建按钮:

输入AppName,选择资源组,点击App Service plan/Location 按钮,在右页点击Create New:

输入App Service Plan Name ,选择区域,点击Prcing tier ,选择B1 Basic (最便宜,测试嘛,能省则省)

选好后,点创建按钮:

一般几分钟后,就能创建成功;

步骤5: 设置VS2017可以访问中国版Azure :

参考:

https://docs.azure.cn/zh-cn/articles/others/aog-portal-management-qa-vs2017-login

步骤6:发布应用

VS2017登录成功后,可以在Server Explorer里看到自己的Azure订阅,以及订阅下面的所有资源;

邮件点击项目发布后,选择发布到MS Azure App Service , 并点选Select Existing ,然后点Publish按钮:

选择准备发布的App Serivce ,然后点 Ok按钮:

Output窗口输出结果:

成功后,会自动启动浏览器打开网页:

EF6 学习笔记(五):数据库迁移及部署的更多相关文章

  1. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  2. EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作

    EF6 学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习 ...

  3. 【EF6学习笔记】目录

    [EF6学习笔记](一)Code First 方式生成数据库及初始化数据库实际操作 [EF6学习笔记](二)操练 CRUD 增删改查 [EF6学习笔记](三)排序.过滤查询及分页 [EF6学习笔记]( ...

  4. ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)

    个人从传统的CS应用开发(WPF)开始转向BS架构应用开发: 先是采用了最容易上手也是最容易搞不清楚状况的WebForm方式入手:到后面就直接抛弃了服务器控件的开发方式,转而采用 普通页面+Ajax+ ...

  5. EF6学习笔记(六) 创建复杂的数据模型

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇原文地址:Creating a More Complex Data Model 本篇讲的比较碎,很多内容本人 ...

  6. EF6学习笔记(四) 弹性连接及命令拦截调试

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...

  7. EF6 学习笔记(二):操练 CRUD 增删改查

    EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...

  8. Kettle学习笔记(一)— 环境部署及运行

    目录 Kettle学习笔记(一)-环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 Kettle简介 Ket ...

  9. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

随机推荐

  1. 什么是python的全局解释锁(GIL)

    GIL解决了Python中的什么问题? 为什么选取GIL作为解决方案? 对多线程Python程序的影响 为什么GIL还没有被删除? 为什么在Python 3 中GIL没有被移除? 如何处理Python ...

  2. 如何配置IIS使其支持APK文件的下载

    在管理工具里打开Internet 信息服务(IIS)管理器.然后选择需要配置的网站. 右侧的界面中会显示该网站的所有功能配置,我们选择并点击进入“MIME类型” 在左侧的操作区选择点击“添加”MIME ...

  3. Object.create() vs new SomeFunction() in javascript

    Object.create builds an object that inherits directly from the one passed as its first argument. Wit ...

  4. VueJs学习笔记

      在cmd下,进入目录之后 cd 到项目目录下 1 安装node cnpm install   2 启动或者调试 cnpm start (或是npm run dev) 3 上线: npm run b ...

  5. git tag的用法

    我们常常在代码封板时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的 git的tag功能 git 下打标 ...

  6. vue项目强制清除页面缓存

    异常描述: 支付宝中内嵌h5项目(vue框架开发),前端重新打包上传之后访问页面会导致页面空白.页面tab点击异常之类异常情况,需要手动清除支付宝缓存才可以正常访问. 解决方案: 在HTTP协议中,只 ...

  7. 【转载】重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  8. 一、Windows许可证即将过期怎么办

    当Win10系统提示“windows许可证即将过期”窗口时,直接点击“转到‘设置’”按钮,此时将显示“Windows激活”界面,从此界面中可以获取当前Win10版本信息. 由于Win10激活即将过期, ...

  9. (转)经验分享:CSS浮动(float,clear)通俗讲解

    文章转自:https://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身 ...

  10. 如何通过RNA-Seq了解转录本的结构

    [转载]如何通过RNA-Seq了解转录本的结构 已有 1942 次阅读 2014-12-26 15:22 |个人分类:转录组测序|系统分类:科研笔记|关键词:RNA-Seq,转录组测序,转录本结构|  ...