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 数据迁移
原文地址:http://www.cnblogs.com/yyxone/p/7583234.html