zoukankan      html  css  js  c++  java
  • Code First Migrations更新数据库结构(数据迁移)

    背景

    code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成。

    要求
    1. 已安装NuGet
    过程示例
    [csharp] 
     1 //原model  
     2 using System.Collections;  
     3 using System.Collections.Generic;  
     4 using System.ComponentModel.DataAnnotations;  
     5 public class Lesson {  
     6     public int lessonID { get; set; }  
     7     [Required]  
     8     [MaxLength(50)]  
     9     public string lessonName { get; set; }  
    10     [Required]  
    11     public string teacherName { get; set; }  
    12     public virtual UserInfo UserInfo{get;set;}  
    13 }  

     

    [csharp] 
     1 //新model  
     2 using System.Collections;  
     3 using System.Collections.Generic;  
     4 using System.ComponentModel.DataAnnotations;  
     5 public class Lesson {  
     6     public int lessonID { get; set; }  
     7     [Required]  
     8     [MaxLength(50)]  
     9     public string lessonName { get; set; }  
    10     [Required]  
    11     [MaxLength(10)]  
    12     public string teacherName { get; set; }  
    13     public virtual UserInfo UserInfo{get;set;}  
    14 }  

    注:区别在于,我们给teacherName属性加了一个长度限制。

    接下来,我们将开始持久化此model至数据库中(我们现在只是对属性作修改,此时数据库中此字段的长度为nvarchar(max),并不是nvarchar(10))

    1:在config中配置数据库连接:

    [html] 
    1 <connectionStrings>  
    2   <add name="TestUsersDB" connectionString="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestUsersDB;Data Source=XCL-PC\SQLEXPRESS" providerName="System.Data.SqlClient" />  
    3 </connectionStrings>  

    2:打开NuGet控制台:

    3:运行命令Enable-Migrations

    可能会出现如下错误:

    Checking if the context targets an existing database...
    Detected database created with a database initializer. Scaffolded migration '201212090821166_InitialCreate' corresponding to existing database. To use an automatic migration instead, delete the Migrations folder and re-run Enable-Migrations specifying the -EnableAutomaticMigrations parameter.
    Code First Migrations enabled for project MvcApplication1.

    此时项目会出现如下文件夹:

    打开configuation.cs,将作出如下修改:

    [csharp] 
    1 public Configuration()  
    2 {  
    3     AutomaticMigrationsEnabled = true;  
    4 } 


    再次执行Update-Database:

    因为我把长度从max改为10,在更新数据结构时,它认为此操作会导致数据丢失,如下:

    Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
    No pending code-based migrations.
    Applying automatic migration: 201212090848057_AutomaticMigration.
    Automatic migration was not applied because it would result in data loss.

    如果确保没事,只需给此命令加个强制执行的参数即可:

    Enable-Migrations -Force

    最后再次执行:Update-Database

    数据库中的原数据也没有丢失!

  • 相关阅读:
    分子动力学中步长的选取
    提高编程能力刷题网站
    【18】如何把数据存储到MongoDB数据库
    【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
    【16】有关python面向对象编程
    【15】杂记章节
    【14】文件读取并格式化处理
    【13】python time时间模块知识点备查
    【11】python 递归,深度优先搜索与广度优先搜索算法模拟实现
    6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)
  • 原文地址:https://www.cnblogs.com/jx0906/p/2880037.html
Copyright © 2011-2022 走看看