码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET MVC 之CodeFirst 数据迁移

时间:2017-09-23 23:24:06      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:img   data   .net   启动   其他   ica   page   变化   英文翻译   

CodeFirst模式下如果 一个 类的属性 增加或者删除 那么 与其对应的 就是 数据库中所对应的 字段 增加或者删除 一个属性变化还好 ,我们直接可以到数据库中找到 ,所对应的表中,对其修改,那么 一次对多个类中的属性做修改,如果 手动 来操作是件很头疼的事情 那么数据迁移 很轻松的解决 问题

 

以下是 我建立的上下文 TestEF

用于测试 用的 班级类 老师类

namespace WebApplication2
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Linq;

    public class TestEF : DbContext
    {
        //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
        //使用“TestEF”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
        //“WebApplication1.TestEF”数据库。
        // 
        //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“TestEF”
        //连接字符串。
        public TestEF()
            : base("name=TestEF")
        {
                   
      } //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First 模型 //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。 public DbSet<Teacher> Teacher { get; set; } public DbSet<Grade> Grade { get; set; } } [Description("老师")] public class Teacher { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//自增长 public int ID { get; set; } [Description("姓名")] public string Name { get; set; } //[Description("年龄")] // public int Age { get; set; } public ICollection<Grade> Grades { get; set; } } [Description("班级")] public class Grade { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } [Description("班级名称")] public string Name { get; set; } public ICollection<Teacher> Teacheres { get; set; } } }

第二步 打开nuget 程序包管理控制平台

技术分享

 第三步 输入命令 Enable-Migrations -ContextTypeName WebApplication2.Models.ApplicationDbContext

技术分享

这时会看到项目下回生成一个文件夹名称为Migrations  他的英文翻译为 迁移的意思 文件夹里有个Configuration 类 在构造函数中 有个属性 为AutomaticMigrationsEnabled 他的意思为 是否 启用数据迁移 我们修改为true 还要设置 一个属性 AutomaticMigrationDataLossAllowed = true; 这个属性的意思为是否允许 数据丢失 ,如果数据库已经生成完毕,但是 我要删除Teacher类中某一个属性 如果 这个属性 没有设置为true 那么 会报错, 提示你 要设置 允许数据丢失么。

技术分享

 

 第四步 在 MvcApplication 类中 设置数据库初始化 代码为   Database.SetInitializer(new MigrateDatabaseToLatestVersion<TestEF, Migrations.Configuration>("TestEF"));

技术分享

 然后我在 HomeController Index 中搞点数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication2.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            TestEF test = new TestEF();
            List<Teacher> teachers = new List<Teacher>();
            List<Grade> grades = new List<Grade>();
            Teacher teacher = new Teacher { Name = "老师" , Grades =grades };
            Grade grade = new Grade { Name ="一年一班" , Teacheres  =teachers};

            teacher.Grades.Add(grade);
            grade.Teacheres.Add(teacher);

            test.Teacher.Add(teacher);
            test.Grade.Add(grade);
            test.SaveChanges();
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

  这个时候 启动项目 看数据库 会看到数据库已经生成好

技术分享

 

这个时候当我们修改 Teacher 类时 添加一个Age 属性 那么 看看数据库会发生什么变化,这时 我们会看到数据库Teacher表中会多出Age列

技术分享

现在 我要把Teacher类中的 Age属性删除 看看 数据库会不会 自动 的删除掉该列 , 提醒 因为我们在Migrations 文件夹中的Configuration 设置了 允许数据丢失 所以该操作不会报错 ,如果报错 请设置AutomaticMigrationDataLossAllowed = true

技术分享

只剩下 ID和 Name 列了。

写的不是很好,请大家多多见谅!

 

ASP.NET MVC 之CodeFirst 数据迁移

标签:img   data   .net   启动   其他   ica   page   变化   英文翻译   

原文地址:http://www.cnblogs.com/yyxone/p/7583234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!