• MVC3 EF Code First 模式下的数据迁移 Kevin


    采用CodeFirst模式开发过程中避免不了实体类跟数据库字段不匹配的问题。

    例如:在程序中定义了Product类

     public class Product
        {
            [HiddenInput(DisplayValue=false)]
            public int ProductID { get; set; }
    
            [Required(ErrorMessage="Please enter a product name")]
            public string Name { get; set; }
    
            [Required(ErrorMessage="Please entere a description")]
            [DataType(DataType.MultilineText)]
            public string Description { get; set; }
    
            [Required]
            [Range(0.01,double.MaxValue,ErrorMessage="Please entere a positive price")]
            public decimal Price { get; set; }
    
            [Required(ErrorMessage="Please Sepcify a category")]
            public string Category { get; set; }
    
            public byte[] ImageData { get; set; }
    
            [HiddenInput(DisplayValue=false)]
            public string ImageType { get; set; }
    
        }
    

    EntityFramework会在我们第一次运行网站的时候自动创建数据库,并生成对应的表。本例采用SqlServer 2012,MySql5.5在测试过程中发现问题,有待新版本的MySql .NET Connnector出来以后再次测试。

    下面是数据库中的表:

    现在在Product类中添加一新属性,Testor

    public class Product
        {
            [HiddenInput(DisplayValue=false)]
            public int ProductID { get; set; }
    
            [Required(ErrorMessage="Please enter a product name")]
            public string Name { get; set; }
    
            [Required(ErrorMessage="Please entere a description")]
            [DataType(DataType.MultilineText)]
            public string Description { get; set; }
    
            [Required]
            [Range(0.01,double.MaxValue,ErrorMessage="Please entere a positive price")]
            public decimal Price { get; set; }
    
            [Required(ErrorMessage="Please Sepcify a category")]
            public string Category { get; set; }
    
            public byte[] ImageData { get; set; }
    
            [HiddenInput(DisplayValue=false)]
            public string ImageType { get; set; }
    
            public string testor { get; set; }
    
        }
    

    运行,报错:

    The model backing the 'EF DbContext' context has changed since the database was created. Consider using Code First Migrations to update the database

    意思是说,数据上下文变动,在CodeFirst模式下与数据库不一致,需要更新数据库。

    解决方法是:

    打开 Package Manager Console  窗口,输入以下命令:

    1.Enable-Migrations :执行完成后你会发现项目解决方案里面多了个Migration文件夹,下面还会有个Configuration的cs文件。

    2.Add-Migration XXX:XXX可以自己定义。

    3.Update-Database -Verbose: -Verbose 是可选参数,带上之后会显示一下有关运行中的情况。

    以后每次改动后,都需要重复 第 2、3步命令。

    PS:可以在Configuration.cs文件里面将 AutomaticMigrationsEnabled 设置为true,这样每次改动类后,只需要输入第三步的命令即可。

    PSS:在删除Product命令的时候,遇到了Automatic migration was not applied because it would result in data loss 的问题,

    在Update-Database -Verbose 后面加一个 -Force 即可。但这样不注意会引起数据的丢失,务必注意。

  • 相关阅读:
    设计模式_抽象工厂模式
    KMeans聚类算法Hadoop实现
    JDK核心JAVA源代码解析(1)
    pushlet单播与多播
    SQL 2008 R2数据库变为REPLICATION,日志不断增长并且不能截断和收缩的解决方式
    chrome插件的popup与跨域请求
    Ubuntu vim+ ctags(包括系统函数) + taglist 配置
    spring Valid @Pattern 常见的验证表达式
    spring boot 全局异常处理
    spring 事件使用
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2976286.html
Copyright © 2020-2023  润新知