ASP.NET MVC 之CodeFirst 数据迁移

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

 

以下是 我建立的上下文 TestEF

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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")
        {
                   <br>      }
 
        //为您要在模型中包含的每种实体类型都添加 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 中搞点数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 列了。

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

 

posted on   是水饺不是水饺  阅读(154)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示